@db-ux/ngx-core-components 4.13.1-angular-signal-forms13-577b861 → 4.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, viewChild, signal, effect, VERSION, Component, model, HostBinding, Directive, TemplateRef, ContentChild } from '@angular/core';
2
+ import { input, output, viewChild, signal, effect, VERSION, Component, model, booleanAttribute, HostBinding, Directive, TemplateRef, ContentChild } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
@@ -634,7 +634,9 @@ const DEFAULT_INVALID_MESSAGE = 'TODO: Add an invalidMessage';
634
634
  const DEFAULT_REMOVE = 'Remove';
635
635
  const DEFAULT_BACK = 'Back';
636
636
  const DEFAULT_SELECTED = 'Selected';
637
- const DEFAULT_BURGER_MENU = 'BurgerMenu';
637
+ const DEFAULT_SCROLL_LEFT = 'Scroll left';
638
+ const DEFAULT_SCROLL_RIGHT = 'Scroll right';
639
+ const DEFAULT_BURGER_MENU = 'Open navigation menu';
638
640
  const DEFAULT_ICON = 'brand';
639
641
  const DEFAULT_ROWS = 4;
640
642
  const DEFAULT_CLOSE_BUTTON = 'Close';
@@ -1615,7 +1617,7 @@ class DBCheckbox {
1615
1617
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
1616
1618
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
1617
1619
  /** Signal Forms optional fields (Duck-Typing compatibility) */
1618
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
1620
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
1619
1621
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
1620
1622
  /** @internal Signal Forms validation state */
1621
1623
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -2056,7 +2058,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
2056
2058
  </div> `, styles: [":host{display:contents}\n"] }]
2057
2059
  }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], iconLeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconLeading", required: false }] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], showIconLeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIconLeading", required: false }] }], showIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIcon", required: false }] }], iconTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "iconTrailing", required: false }] }], showIconTrailing: [{ type: i0.Input, args: [{ isSignal: true, alias: "showIconTrailing", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], noText: [{ type: i0.Input, args: [{ isSignal: true, alias: "noText", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
2058
2060
 
2059
- class DocumentClickListener {
2061
+ /**
2062
+ * Generic base class for singleton document event listeners.
2063
+ * Manages a shared set of callbacks dispatched when a document-level
2064
+ * event fires.
2065
+ *
2066
+ * Subclasses own their static state (callbacks, instance) and expose
2067
+ * it via the abstract accessor methods below.
2068
+ *
2069
+ * @template TEvent - The event type passed to callbacks (Event, MouseEvent, etc.)
2070
+ */
2071
+ class AbstractDocumentListener {
2072
+ addCallback(callback) {
2073
+ const id = uuid();
2074
+ const callbacks = this.getCallbacks();
2075
+ callbacks[id] = callback;
2076
+ return id;
2077
+ }
2078
+ removeCallback(id) {
2079
+ const callbacks = this.getCallbacks();
2080
+ delete callbacks[id];
2081
+ }
2082
+ }
2083
+
2084
+ class DocumentClickListener extends AbstractDocumentListener {
2060
2085
  static { this.callbacks = {}; }
2061
2086
  static { this._instance = null; }
2062
2087
  static runCallbacks(event) {
@@ -2067,6 +2092,7 @@ class DocumentClickListener {
2067
2092
  }
2068
2093
  }
2069
2094
  constructor() {
2095
+ super();
2070
2096
  if (DocumentClickListener._instance) {
2071
2097
  return DocumentClickListener._instance;
2072
2098
  }
@@ -2075,17 +2101,12 @@ class DocumentClickListener {
2075
2101
  self.document.addEventListener('click', event => DocumentClickListener.runCallbacks(event));
2076
2102
  }
2077
2103
  }
2078
- addCallback(callback) {
2079
- const callbackID = uuid();
2080
- DocumentClickListener.callbacks[callbackID] = callback;
2081
- return callbackID;
2082
- }
2083
- removeCallback(id) {
2084
- delete DocumentClickListener.callbacks[id];
2104
+ getCallbacks() {
2105
+ return DocumentClickListener.callbacks;
2085
2106
  }
2086
2107
  }
2087
2108
 
2088
- class DocumentScrollListener {
2109
+ class DocumentScrollListener extends AbstractDocumentListener {
2089
2110
  static { this.callbacks = {}; }
2090
2111
  static { this._instance = null; }
2091
2112
  static runCallbacks(event) {
@@ -2096,6 +2117,7 @@ class DocumentScrollListener {
2096
2117
  }
2097
2118
  }
2098
2119
  constructor() {
2120
+ super();
2099
2121
  this.ticking = false;
2100
2122
  if (DocumentScrollListener._instance) {
2101
2123
  return DocumentScrollListener._instance;
@@ -2113,79 +2135,12 @@ class DocumentScrollListener {
2113
2135
  }, true);
2114
2136
  }
2115
2137
  }
2116
- addCallback(callback) {
2117
- const callbackID = uuid();
2118
- DocumentScrollListener.callbacks[callbackID] = callback;
2119
- return callbackID;
2120
- }
2121
- removeCallback(id) {
2122
- delete DocumentScrollListener.callbacks[id];
2138
+ getCallbacks() {
2139
+ return DocumentScrollListener.callbacks;
2123
2140
  }
2124
2141
  }
2125
2142
 
2126
2143
  // TODO: We should reevaluate this as soon as CSS Anchor Positioning is supported in all relevant browsers
2127
- const isInView = (el) => {
2128
- const { top, bottom, left, right } = el.getBoundingClientRect();
2129
- const { innerHeight, innerWidth } = window;
2130
- let outTop = top < 0;
2131
- let outBottom = bottom > innerHeight;
2132
- let outLeft = left < 0;
2133
- let outRight = right > innerWidth;
2134
- // We need to check if it was already outside
2135
- const outsideY = el.dataset['outsideVy'];
2136
- const outsideX = el.dataset['outsideVx'];
2137
- const parentRect = el?.parentElement?.getBoundingClientRect();
2138
- if (parentRect) {
2139
- if (outsideY) {
2140
- const position = el.dataset['outsideVy'];
2141
- if (position === 'top') {
2142
- outTop = parentRect.top - (bottom - parentRect.bottom) < 0;
2143
- }
2144
- else {
2145
- outBottom = parentRect.bottom + (parentRect.top - top) > innerHeight;
2146
- }
2147
- }
2148
- if (outsideX) {
2149
- const position = el.dataset['outsideVx'];
2150
- if (position === 'left') {
2151
- outLeft = parentRect.left - (right - parentRect.right) < 0;
2152
- }
2153
- else {
2154
- outRight = parentRect.right + (parentRect.left - left) > innerWidth;
2155
- }
2156
- }
2157
- }
2158
- return {
2159
- outTop,
2160
- outBottom,
2161
- outLeft,
2162
- outRight
2163
- };
2164
- };
2165
- const handleDataOutside = (el) => {
2166
- const { outTop, outBottom, outLeft, outRight } = isInView(el);
2167
- let dataOutsidePair = {};
2168
- if (outTop || outBottom) {
2169
- dataOutsidePair = {
2170
- vy: outTop ? 'top' : 'bottom'
2171
- };
2172
- el.dataset['outsideVy'] = dataOutsidePair.vy;
2173
- }
2174
- else {
2175
- delete el.dataset['outsideVy'];
2176
- }
2177
- if (outLeft || outRight) {
2178
- dataOutsidePair = {
2179
- ...dataOutsidePair,
2180
- vx: outRight ? 'right' : 'left'
2181
- };
2182
- el.dataset['outsideVx'] = dataOutsidePair.vx;
2183
- }
2184
- else {
2185
- delete el.dataset['outsideVx'];
2186
- }
2187
- return dataOutsidePair;
2188
- };
2189
2144
  const handleFixedDropdown = (element, parent, placement) => {
2190
2145
  if (!element || !parent)
2191
2146
  return;
@@ -2201,9 +2156,11 @@ const handleFixedDropdown = (element, parent, placement) => {
2201
2156
  // mobile max-inline-size guard and overflows the viewport.
2202
2157
  element.style.inlineSize = '';
2203
2158
  element.style.minInlineSize = '';
2204
- // We skip the rest if we are in mobile, it's already fixed via CSS.
2205
- if (getComputedStyle(element).zIndex === '9999')
2159
+ // We skip this if we are in mobile it's already fixed or if we don't have a floating dropdown
2160
+ const computedStyle = getComputedStyle(element);
2161
+ if (computedStyle.zIndex === '9999' || computedStyle.position !== 'fixed' && computedStyle.position !== 'absolute') {
2206
2162
  return;
2163
+ }
2207
2164
  const { top, bottom, childHeight, childWidth, width, right, left, correctedPlacement, innerWidth } = getFloatingProps(element, parent, placement);
2208
2165
  // For auto width the dropdown is forced to be at least as wide as the trigger,
2209
2166
  // but clamped to its own max-inline-size: CSS lets a min-inline-size override
@@ -2278,27 +2235,38 @@ const getFloatingProps = (element, parent, placement) => {
2278
2235
  let childHeight = childRect.height;
2279
2236
  let childWidth = childRect.width;
2280
2237
  if (placement === 'bottom' || placement === 'top') {
2281
- childWidth = childWidth / 2;
2238
+ childWidth = width > childWidth ? 0 : childWidth / 2;
2282
2239
  }
2283
2240
  if (placement === 'left' || placement === 'right') {
2284
- childHeight = childHeight / 2;
2241
+ childHeight = height > childHeight ? 0 : childHeight / 2;
2285
2242
  }
2286
- const outsideBottom = bottom + childHeight > innerHeight;
2287
- const outsideTop = top - childHeight < 0;
2288
- const outsideLeft = left - childWidth < 0;
2289
- const outsideRight = right + childWidth > innerWidth;
2243
+ const outsideBottom = Math.floor(bottom + childHeight) > innerHeight;
2244
+ const outsideTop = Math.ceil(top - childHeight) < 0;
2245
+ const outsideLeft = Math.ceil(left - childWidth) < 0;
2246
+ const outsideRight = Math.floor(right + childWidth) > innerWidth;
2290
2247
  let correctedPlacement = placement;
2291
2248
  if (placement.startsWith('bottom')) {
2292
2249
  if (outsideBottom) {
2293
- correctedPlacement = placement?.replace('bottom', 'top');
2294
- if (outsideLeft && outsideRight) {
2295
- correctedPlacement = 'top';
2296
- }
2297
- else if (outsideLeft) {
2298
- correctedPlacement = 'top-start';
2250
+ if (!outsideTop) {
2251
+ correctedPlacement = placement?.replace('bottom', 'top');
2252
+ if (outsideLeft && outsideRight) {
2253
+ correctedPlacement = 'top';
2254
+ }
2255
+ else if (outsideLeft) {
2256
+ correctedPlacement = 'top-start';
2257
+ }
2258
+ else if (outsideRight) {
2259
+ correctedPlacement = 'top-end';
2260
+ }
2299
2261
  }
2300
- else if (outsideRight) {
2301
- correctedPlacement = 'top-end';
2262
+ else {
2263
+ // Both outsideBottom and outsideTop: keep bottom but still apply horizontal correction
2264
+ if (outsideLeft) {
2265
+ correctedPlacement = 'bottom-start';
2266
+ }
2267
+ else if (outsideRight) {
2268
+ correctedPlacement = 'bottom-end';
2269
+ }
2302
2270
  }
2303
2271
  }
2304
2272
  else {
@@ -2315,15 +2283,26 @@ const getFloatingProps = (element, parent, placement) => {
2315
2283
  }
2316
2284
  else if (placement.startsWith('top')) {
2317
2285
  if (outsideTop) {
2318
- correctedPlacement = placement?.replace('top', 'bottom');
2319
- if (outsideLeft && outsideRight) {
2320
- correctedPlacement = 'bottom';
2321
- }
2322
- else if (outsideLeft) {
2323
- correctedPlacement = 'bottom-start';
2286
+ if (!outsideBottom) {
2287
+ correctedPlacement = placement?.replace('top', 'bottom');
2288
+ if (outsideLeft && outsideRight) {
2289
+ correctedPlacement = 'bottom';
2290
+ }
2291
+ else if (outsideLeft) {
2292
+ correctedPlacement = 'bottom-start';
2293
+ }
2294
+ else if (outsideRight) {
2295
+ correctedPlacement = 'bottom-end';
2296
+ }
2324
2297
  }
2325
- else if (outsideRight) {
2326
- correctedPlacement = 'bottom-end';
2298
+ else {
2299
+ // Both outsideTop and outsideBottom: keep top but still apply horizontal correction
2300
+ if (outsideLeft) {
2301
+ correctedPlacement = 'top-start';
2302
+ }
2303
+ else if (outsideRight) {
2304
+ correctedPlacement = 'top-end';
2305
+ }
2327
2306
  }
2328
2307
  }
2329
2308
  else {
@@ -2340,15 +2319,17 @@ const getFloatingProps = (element, parent, placement) => {
2340
2319
  }
2341
2320
  else if (placement.startsWith('left')) {
2342
2321
  if (outsideLeft) {
2343
- correctedPlacement = placement?.replace('left', 'right');
2344
- if (outsideBottom && outsideTop) {
2345
- correctedPlacement = 'right';
2346
- }
2347
- else if (outsideBottom) {
2348
- correctedPlacement = 'right-end';
2349
- }
2350
- else if (outsideTop) {
2351
- correctedPlacement = 'right-start';
2322
+ if (!outsideRight) {
2323
+ correctedPlacement = placement?.replace('left', 'right');
2324
+ if (outsideBottom && outsideTop) {
2325
+ correctedPlacement = 'right';
2326
+ }
2327
+ else if (outsideBottom) {
2328
+ correctedPlacement = 'right-end';
2329
+ }
2330
+ else if (outsideTop) {
2331
+ correctedPlacement = 'right-start';
2332
+ }
2352
2333
  }
2353
2334
  }
2354
2335
  else {
@@ -2365,15 +2346,17 @@ const getFloatingProps = (element, parent, placement) => {
2365
2346
  }
2366
2347
  else if (correctedPlacement.startsWith('right')) {
2367
2348
  if (outsideRight) {
2368
- correctedPlacement = placement?.replace('right', 'left');
2369
- if (outsideBottom && outsideTop) {
2370
- correctedPlacement = 'left';
2371
- }
2372
- else if (outsideBottom) {
2373
- correctedPlacement = 'left-end';
2374
- }
2375
- else if (outsideTop) {
2376
- correctedPlacement = 'left-start';
2349
+ if (!outsideLeft) {
2350
+ correctedPlacement = placement?.replace('right', 'left');
2351
+ if (outsideBottom && outsideTop) {
2352
+ correctedPlacement = 'left';
2353
+ }
2354
+ else if (outsideBottom) {
2355
+ correctedPlacement = 'left-end';
2356
+ }
2357
+ else if (outsideTop) {
2358
+ correctedPlacement = 'left-start';
2359
+ }
2377
2360
  }
2378
2361
  }
2379
2362
  else {
@@ -2399,7 +2382,8 @@ const getFloatingProps = (element, parent, placement) => {
2399
2382
  childWidth: childRect.width,
2400
2383
  correctedPlacement,
2401
2384
  innerWidth,
2402
- innerHeight
2385
+ innerHeight,
2386
+ outsideYBoth: outsideTop && outsideBottom
2403
2387
  };
2404
2388
  };
2405
2389
  const MAX_ANCESTOR_DEPTH = 10;
@@ -2428,8 +2412,17 @@ const handleFixedPopover = (element, parent, placement) => {
2428
2412
  const parentHasFloatingPosition = ['absolute', 'fixed'].includes(parentComputedStyles.position);
2429
2413
  const ancestorWithCorrectedPlacement = getAncestorHasCorrectedPlacement(element);
2430
2414
  const noFloatingAncestor = !ancestorWithCorrectedPlacement && !parentHasFloatingPosition;
2431
- const distance = getComputedStyle(element)?.getPropertyValue('--db-popover-distance') ?? '0px';
2432
- let { top, height, width, childHeight, childWidth, right, left, bottom, correctedPlacement, innerWidth, innerHeight } = getFloatingProps(element, parent, placement);
2415
+ const computedStyle = getComputedStyle(element);
2416
+ // We skip if we don't have a floating popover
2417
+ if (computedStyle.position !== 'fixed' && computedStyle.position !== 'absolute') {
2418
+ return;
2419
+ }
2420
+ let distance = computedStyle.getPropertyValue('--db-popover-distance');
2421
+ if (!distance.length) {
2422
+ distance = '0px';
2423
+ }
2424
+ const elementPlacement = element?.dataset?.['placement'] ?? placement ?? 'bottom';
2425
+ let { top, height, width, childHeight, childWidth, right, left, bottom, correctedPlacement, innerWidth, innerHeight, outsideYBoth } = getFloatingProps(element, parent, elementPlacement);
2433
2426
  if (ancestorWithCorrectedPlacement) {
2434
2427
  const ancestorRect = ancestorWithCorrectedPlacement.getBoundingClientRect();
2435
2428
  left = Math.abs(left - ancestorRect.left);
@@ -2477,6 +2470,10 @@ const handleFixedPopover = (element, parent, placement) => {
2477
2470
  }
2478
2471
  }
2479
2472
  // Popover position
2473
+ // Reset shorthand inset properties from previous calls (e.g. outsideYBoth)
2474
+ // before writing new individual inset values
2475
+ element.style.insetBlock = '';
2476
+ element.style.insetInline = '';
2480
2477
  if (correctedPlacement === 'right' || correctedPlacement === 'left') {
2481
2478
  // center horizontally
2482
2479
  element.style.insetBlockStart = `${top + height / 2}px`;
@@ -2525,10 +2522,218 @@ const handleFixedPopover = (element, parent, placement) => {
2525
2522
  element.style.insetBlockStart = `calc(${parentHasFloatingPosition ? end : bottom}px + ${distance})`;
2526
2523
  element.style.insetBlockEnd = `calc(${noFloatingAncestor && end > innerHeight ? innerHeight : end}px + ${distance})`;
2527
2524
  }
2525
+ // In this case we are outside of top and bottom so we need to scroll
2526
+ // We use the full height in this case
2527
+ if (outsideYBoth) {
2528
+ element.style.overflow = 'hidden auto';
2529
+ element.style.insetBlock = distance;
2530
+ element.style.maxBlockSize = `calc(${innerHeight}px - 2 * ${distance})`;
2531
+ }
2532
+ else {
2533
+ element.style.overflow = '';
2534
+ element.style.maxBlockSize = '';
2535
+ }
2528
2536
  element.style.position = 'fixed';
2529
2537
  element.dataset['correctedPlacement'] = correctedPlacement;
2538
+ // Set data-outside-vy / data-outside-vx for CSS-based flipping
2539
+ handleDataOutside(element);
2540
+ };
2541
+ const handleDataOutside = (el) => {
2542
+ const { outTop, outBottom, outLeft, outRight } = isInView(el);
2543
+ let dataOutsidePair = {};
2544
+ if (outTop || outBottom) {
2545
+ dataOutsidePair = {
2546
+ vy: outTop ? 'top' : 'bottom'
2547
+ };
2548
+ el.dataset['outsideVy'] = dataOutsidePair.vy;
2549
+ }
2550
+ else {
2551
+ delete el.dataset['outsideVy'];
2552
+ }
2553
+ if (outLeft || outRight) {
2554
+ dataOutsidePair = {
2555
+ ...dataOutsidePair,
2556
+ vx: outRight ? 'right' : 'left'
2557
+ };
2558
+ el.dataset['outsideVx'] = dataOutsidePair.vx;
2559
+ }
2560
+ else {
2561
+ delete el.dataset['outsideVx'];
2562
+ }
2563
+ return dataOutsidePair;
2564
+ };
2565
+ const isInView = (el) => {
2566
+ const { top, bottom, left, right } = el.getBoundingClientRect();
2567
+ const { innerHeight, innerWidth } = window;
2568
+ let outTop = top < 0;
2569
+ let outBottom = bottom > innerHeight;
2570
+ let outLeft = left < 0;
2571
+ let outRight = right > innerWidth;
2572
+ // We need to check if it was already outside
2573
+ const outsideY = el.dataset['outsideVy'];
2574
+ const outsideX = el.dataset['outsideVx'];
2575
+ const parentRect = el?.parentElement?.getBoundingClientRect();
2576
+ if (parentRect) {
2577
+ if (outsideY) {
2578
+ const position = el.dataset['outsideVy'];
2579
+ if (position === 'top') {
2580
+ outTop = parentRect.top - (bottom - parentRect.bottom) < 0;
2581
+ }
2582
+ else {
2583
+ outBottom = parentRect.bottom + (parentRect.top - top) > innerHeight;
2584
+ }
2585
+ }
2586
+ if (outsideX) {
2587
+ const position = el.dataset['outsideVx'];
2588
+ if (position === 'left') {
2589
+ outLeft = parentRect.left - (right - parentRect.right) < 0;
2590
+ }
2591
+ else {
2592
+ outRight = parentRect.right + (parentRect.left - left) > innerWidth;
2593
+ }
2594
+ }
2595
+ }
2596
+ return {
2597
+ outTop,
2598
+ outBottom,
2599
+ outLeft,
2600
+ outRight
2601
+ };
2530
2602
  };
2531
2603
 
2604
+ /**
2605
+ * Generic base class for singleton observer listeners.
2606
+ * Uses a Map<Element, Map<id, callback>> for O(1) element lookup in the
2607
+ * observer handler — avoids quadratic scanning when many elements are observed.
2608
+ *
2609
+ * Subclasses own their static state (callbacksByElement, idToElement, observer,
2610
+ * instance) and expose it via the abstract accessor methods below.
2611
+ *
2612
+ * @template TObserver - The observer type (ResizeObserver, IntersectionObserver, etc.)
2613
+ * @template TEntry - The entry type passed to the callback
2614
+ */
2615
+ class AbstractObserverListener {
2616
+ observe(element, callback) {
2617
+ const observer = this.getObserver();
2618
+ if (!observer)
2619
+ return undefined;
2620
+ const id = uuid();
2621
+ const callbacksByElement = this.getCallbacksByElement();
2622
+ const idToElement = this.getIdToElement();
2623
+ let elementCallbacks = callbacksByElement.get(element);
2624
+ if (!elementCallbacks) {
2625
+ elementCallbacks = new Map();
2626
+ callbacksByElement.set(element, elementCallbacks);
2627
+ // Only call observe on the native observer if this is a new element
2628
+ this.observeElement(observer, element);
2629
+ }
2630
+ elementCallbacks.set(id, callback);
2631
+ idToElement.set(id, element);
2632
+ return id;
2633
+ }
2634
+ unobserve(id) {
2635
+ const callbacksByElement = this.getCallbacksByElement();
2636
+ const idToElement = this.getIdToElement();
2637
+ const observer = this.getObserver();
2638
+ const element = idToElement.get(id);
2639
+ if (!element || !observer)
2640
+ return;
2641
+ const elementCallbacks = callbacksByElement.get(element);
2642
+ if (elementCallbacks) {
2643
+ elementCallbacks.delete(id);
2644
+ // If no more callbacks for this element, unobserve it
2645
+ if (elementCallbacks.size === 0) {
2646
+ callbacksByElement.delete(element);
2647
+ this.unobserveElement(observer, element);
2648
+ }
2649
+ }
2650
+ idToElement.delete(id);
2651
+ }
2652
+ /**
2653
+ * Called by subclass observer handlers to dispatch callbacks for an entry.
2654
+ */
2655
+ dispatchEntry(element, entry) {
2656
+ const elementCallbacks = this.getCallbacksByElement().get(element);
2657
+ if (elementCallbacks) {
2658
+ elementCallbacks.forEach(callback => {
2659
+ callback(entry);
2660
+ });
2661
+ }
2662
+ }
2663
+ }
2664
+
2665
+ class IntersectionObserverListener extends AbstractObserverListener {
2666
+ static { this._instance = null; }
2667
+ static { this.callbacksByElement = new Map(); }
2668
+ static { this.idToElement = new Map(); }
2669
+ static { this.observer = null; }
2670
+ constructor() {
2671
+ super();
2672
+ if (IntersectionObserverListener._instance) {
2673
+ return IntersectionObserverListener._instance;
2674
+ }
2675
+ IntersectionObserverListener._instance = this;
2676
+ if (typeof window !== 'undefined' && 'IntersectionObserver' in window) {
2677
+ IntersectionObserverListener.observer = new IntersectionObserver(entries => {
2678
+ for (const entry of entries) {
2679
+ this.dispatchEntry(entry.target, entry);
2680
+ }
2681
+ });
2682
+ }
2683
+ }
2684
+ getCallbacksByElement() {
2685
+ return IntersectionObserverListener.callbacksByElement;
2686
+ }
2687
+ getIdToElement() {
2688
+ return IntersectionObserverListener.idToElement;
2689
+ }
2690
+ getObserver() {
2691
+ return IntersectionObserverListener.observer;
2692
+ }
2693
+ observeElement(observer, element) {
2694
+ observer.observe(element);
2695
+ }
2696
+ unobserveElement(observer, element) {
2697
+ observer.unobserve(element);
2698
+ }
2699
+ }
2700
+
2701
+ class ResizeObserverListener extends AbstractObserverListener {
2702
+ static { this._instance = null; }
2703
+ static { this.callbacksByElement = new Map(); }
2704
+ static { this.idToElement = new Map(); }
2705
+ static { this.observer = null; }
2706
+ constructor() {
2707
+ super();
2708
+ if (ResizeObserverListener._instance) {
2709
+ return ResizeObserverListener._instance;
2710
+ }
2711
+ ResizeObserverListener._instance = this;
2712
+ if (typeof window !== 'undefined' && 'ResizeObserver' in window) {
2713
+ ResizeObserverListener.observer = new ResizeObserver(entries => {
2714
+ for (const entry of entries) {
2715
+ this.dispatchEntry(entry.target, entry);
2716
+ }
2717
+ });
2718
+ }
2719
+ }
2720
+ getCallbacksByElement() {
2721
+ return ResizeObserverListener.callbacksByElement;
2722
+ }
2723
+ getIdToElement() {
2724
+ return ResizeObserverListener.idToElement;
2725
+ }
2726
+ getObserver() {
2727
+ return ResizeObserverListener.observer;
2728
+ }
2729
+ observeElement(observer, element) {
2730
+ observer.observe(element);
2731
+ }
2732
+ unobserveElement(observer, element) {
2733
+ observer.unobserve(element);
2734
+ }
2735
+ }
2736
+
2532
2737
  const defaultProps$z = { width: "fixed" };
2533
2738
  class DBCustomSelectDropdown {
2534
2739
  setupObserver(element) {
@@ -2692,7 +2897,7 @@ class DBCustomSelectListItem {
2692
2897
  this.hasDivider = signal(false, ...(ngDevMode ? [{ debugName: "hasDivider" }] : /* istanbul ignore next */ []));
2693
2898
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
2694
2899
  /** Signal Forms optional fields (Duck-Typing compatibility) */
2695
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
2900
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
2696
2901
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
2697
2902
  /** Signal Forms touch output — emitted on blur to mark the control as touched */
2698
2903
  this.touch = output();
@@ -2993,7 +3198,10 @@ class DBInput {
2993
3198
  // Only reflect regexes that are full-match (anchored with ^ and $) to the HTML pattern attribute.
2994
3199
  // Partial-match regexes (e.g. /^https?:\/\//) would change semantics because browser patterns
2995
3200
  // implicitly match the entire value (as if wrapped in ^(?:...)$).
2996
- const fullMatch = p.filter((r) => r.source.startsWith('^') && r.source.endsWith('$'));
3201
+ // Additionally, skip regexes with flags (e.g. /i for case-insensitive) because HTML pattern
3202
+ // does not support flags — reflecting them would cause a semantics mismatch where Signal Forms
3203
+ // considers the value valid but the browser pattern rejects it.
3204
+ const fullMatch = p.filter((r) => r.source.startsWith('^') && r.source.endsWith('$') && !r.flags);
2997
3205
  if (fullMatch.length === 0)
2998
3206
  return undefined;
2999
3207
  // Strip anchors since HTML pattern is implicitly anchored
@@ -3223,7 +3431,7 @@ class DBInput {
3223
3431
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
3224
3432
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
3225
3433
  /** Signal Forms optional fields (Duck-Typing compatibility) */
3226
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
3434
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
3227
3435
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
3228
3436
  /** @internal Signal Forms validation state */
3229
3437
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -3607,7 +3815,7 @@ class DBTooltip {
3607
3815
  void delay(() => {
3608
3816
  // Due to race conditions we need to check for _ref again
3609
3817
  if (this._ref()?.nativeElement) {
3610
- handleFixedPopover(this._ref()?.nativeElement, parent, this.placement() ?? "bottom");
3818
+ handleFixedPopover(this._ref()?.nativeElement, parent);
3611
3819
  }
3612
3820
  }, 1);
3613
3821
  }
@@ -3629,7 +3837,14 @@ class DBTooltip {
3629
3837
  new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
3630
3838
  this._documentScrollListenerCallbackId.set(undefined);
3631
3839
  }
3632
- this._observer()?.unobserve(this.getParent());
3840
+ if (this._resizeObserverCallbackId()) {
3841
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
3842
+ this._resizeObserverCallbackId.set(undefined);
3843
+ }
3844
+ if (this._intersectionObserverCallbackId()) {
3845
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
3846
+ this._intersectionObserverCallbackId.set(undefined);
3847
+ }
3633
3848
  }
3634
3849
  handleEnter(parent) {
3635
3850
  // Register the shared scroll callback only for the first active
@@ -3638,7 +3853,12 @@ class DBTooltip {
3638
3853
  this._activeTriggerCount.set((this._activeTriggerCount() ?? 0) + 1);
3639
3854
  if (this._activeTriggerCount() === 1) {
3640
3855
  this._documentScrollListenerCallbackId.set(new DocumentScrollListener().addCallback((event) => this.handleDocumentScroll(event, parent)));
3641
- this._observer()?.observe(this.getParent());
3856
+ this._resizeObserverCallbackId.set(new ResizeObserverListener().observe(document.documentElement, () => this.handleAutoPlacement(parent)));
3857
+ this._intersectionObserverCallbackId.set(new IntersectionObserverListener().observe(this.getParent(), (entry) => {
3858
+ if (!entry.isIntersecting) {
3859
+ this.handleEscape(false);
3860
+ }
3861
+ }));
3642
3862
  }
3643
3863
  this.handleAutoPlacement(parent);
3644
3864
  }
@@ -3651,8 +3871,14 @@ class DBTooltip {
3651
3871
  new DocumentScrollListener().removeCallback(callbackId);
3652
3872
  this._documentScrollListenerCallbackId.set(undefined);
3653
3873
  }
3654
- this._observer()?.disconnect();
3655
- this._observer.set(undefined);
3874
+ if (this._resizeObserverCallbackId()) {
3875
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
3876
+ this._resizeObserverCallbackId.set(undefined);
3877
+ }
3878
+ if (this._intersectionObserverCallbackId()) {
3879
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
3880
+ this._intersectionObserverCallbackId.set(undefined);
3881
+ }
3656
3882
  this._activeTriggerCount.set(0);
3657
3883
  const bound = this._boundListeners() ?? [];
3658
3884
  bound.forEach((entry) => {
@@ -3706,7 +3932,6 @@ class DBTooltip {
3706
3932
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
3707
3933
  this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
3708
3934
  this.variant = input(...(ngDevMode ? [undefined, { debugName: "variant" }] : /* istanbul ignore next */ []));
3709
- this.placement = input(...(ngDevMode ? [undefined, { debugName: "placement" }] : /* istanbul ignore next */ []));
3710
3935
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
3711
3936
  this.emphasis = input(...(ngDevMode ? [undefined, { debugName: "emphasis" }] : /* istanbul ignore next */ []));
3712
3937
  this.wrap = input(...(ngDevMode ? [undefined, { debugName: "wrap" }] : /* istanbul ignore next */ []));
@@ -3714,12 +3939,14 @@ class DBTooltip {
3714
3939
  this.delay = input(...(ngDevMode ? [undefined, { debugName: "delay" }] : /* istanbul ignore next */ []));
3715
3940
  this.width = input(...(ngDevMode ? [undefined, { debugName: "width" }] : /* istanbul ignore next */ []));
3716
3941
  this.showArrow = input(...(ngDevMode ? [undefined, { debugName: "showArrow" }] : /* istanbul ignore next */ []));
3942
+ this.placement = input(...(ngDevMode ? [undefined, { debugName: "placement" }] : /* istanbul ignore next */ []));
3717
3943
  this.text = input(...(ngDevMode ? [undefined, { debugName: "text" }] : /* istanbul ignore next */ []));
3718
3944
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
3719
3945
  this._id = signal(DEFAULT_ID, ...(ngDevMode ? [{ debugName: "_id" }] : /* istanbul ignore next */ []));
3720
3946
  this.initialized = signal(false, ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
3721
3947
  this._documentScrollListenerCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_documentScrollListenerCallbackId" }] : /* istanbul ignore next */ []));
3722
- this._observer = signal(undefined, ...(ngDevMode ? [{ debugName: "_observer" }] : /* istanbul ignore next */ []));
3948
+ this._intersectionObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_intersectionObserverCallbackId" }] : /* istanbul ignore next */ []));
3949
+ this._resizeObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_resizeObserverCallbackId" }] : /* istanbul ignore next */ []));
3723
3950
  this._attachedParent = signal(undefined, ...(ngDevMode ? [{ debugName: "_attachedParent" }] : /* istanbul ignore next */ []));
3724
3951
  this._attachedId = signal(undefined, ...(ngDevMode ? [{ debugName: "_attachedId" }] : /* istanbul ignore next */ []));
3725
3952
  this._activeTriggerCount = signal(0, ...(ngDevMode ? [{ debugName: "_activeTriggerCount" }] : /* istanbul ignore next */ []));
@@ -3792,15 +4019,6 @@ class DBTooltip {
3792
4019
  this._attachedParent.set(parent);
3793
4020
  this._attachedId.set(this._id());
3794
4021
  }
3795
- if (typeof window !== "undefined" &&
3796
- "IntersectionObserver" in window) {
3797
- this._observer.set(new IntersectionObserver((payload) => {
3798
- const entry = payload.find(({ target }) => target === this.getParent());
3799
- if (entry && !entry.isIntersecting) {
3800
- this.handleEscape(false);
3801
- }
3802
- }));
3803
- }
3804
4022
  this.initialized.set(false);
3805
4023
  }
3806
4024
  }, Number(VERSION.major) < 19
@@ -3863,7 +4081,7 @@ class DBTooltip {
3863
4081
  this.observer()?.disconnect();
3864
4082
  }
3865
4083
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTooltip, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3866
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTooltip, isStandalone: true, selector: "db-tooltip", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "showArrow", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<i
4084
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTooltip, isStandalone: true, selector: "db-tooltip", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, emphasis: { classPropertyName: "emphasis", publicName: "emphasis", isSignal: true, isRequired: false, transformFunction: null }, wrap: { classPropertyName: "wrap", publicName: "wrap", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, showArrow: { classPropertyName: "showArrow", publicName: "showArrow", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, text: { classPropertyName: "text", publicName: "text", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<i
3867
4085
  role="tooltip"
3868
4086
  aria-hidden="true"
3869
4087
  data-gap="true"
@@ -3900,7 +4118,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
3900
4118
  (click)="handleClick($event)"
3901
4119
  >@if(text()){{{text()}}} <ng-content></ng-content
3902
4120
  ></i> `, styles: [":host{display:contents}\n"] }]
3903
- }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], emphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasis", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrow", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
4121
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], emphasis: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasis", required: false }] }], wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrap", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], showArrow: [{ type: i0.Input, args: [{ isSignal: true, alias: "showArrow", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], text: [{ type: i0.Input, args: [{ isSignal: true, alias: "text", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
3904
4122
 
3905
4123
  const defaultProps$u = {};
3906
4124
  class DBTag {
@@ -4037,7 +4255,7 @@ class DBTag {
4037
4255
  <db-tooltip variant="label">{{getRemoveButtonText()}}</db-tooltip>
4038
4256
  </button>
4039
4257
  }
4040
- </div> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTooltip, selector: "db-tooltip", inputs: ["id", "propOverrides", "variant", "placement", "className", "emphasis", "wrap", "animation", "delay", "width", "showArrow", "text"] }] }); }
4258
+ </div> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTooltip, selector: "db-tooltip", inputs: ["id", "propOverrides", "variant", "className", "emphasis", "wrap", "animation", "delay", "width", "showArrow", "placement", "text"] }] }); }
4041
4259
  }
4042
4260
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTag, decorators: [{
4043
4261
  type: Component,
@@ -4177,7 +4395,13 @@ class DBCustomSelect {
4177
4395
  this._documentClickListenerCallbackId.set(new DocumentClickListener().addCallback((event) => this.handleDocumentClose(event)));
4178
4396
  this._documentScrollListenerCallbackId.set(new DocumentScrollListener().addCallback((event) => this.handleDocumentScroll(event)));
4179
4397
  this.handleAutoPlacement();
4180
- this._observer()?.observe(this.detailsRef()?.nativeElement);
4398
+ this._resizeObserverCallbackId.set(new ResizeObserverListener().observe(document.documentElement, () => this.handleAutoPlacement()));
4399
+ this._intersectionObserverCallbackId.set(new IntersectionObserverListener().observe(this.detailsRef().nativeElement, (entry) => {
4400
+ if (!entry.isIntersecting &&
4401
+ this.detailsRef()?.nativeElement.open) {
4402
+ this.detailsRef().nativeElement.open = false;
4403
+ }
4404
+ }));
4181
4405
  if (!event.target.dataset["test"]) {
4182
4406
  // We need this workaround for snapshot testing
4183
4407
  this.handleOpenByKeyboardFocus();
@@ -4190,7 +4414,12 @@ class DBCustomSelect {
4190
4414
  if (this._documentScrollListenerCallbackId()) {
4191
4415
  new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
4192
4416
  }
4193
- this._observer()?.unobserve(this.detailsRef()?.nativeElement);
4417
+ if (this._resizeObserverCallbackId()) {
4418
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
4419
+ }
4420
+ if (this._intersectionObserverCallbackId()) {
4421
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
4422
+ }
4194
4423
  }
4195
4424
  }
4196
4425
  getNativeSelectValue() {
@@ -4678,13 +4907,14 @@ class DBCustomSelect {
4678
4907
  this._documentClickListenerCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_documentClickListenerCallbackId" }] : /* istanbul ignore next */ []));
4679
4908
  this._internalChangeTimestamp = signal(0, ...(ngDevMode ? [{ debugName: "_internalChangeTimestamp" }] : /* istanbul ignore next */ []));
4680
4909
  this._documentScrollListenerCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_documentScrollListenerCallbackId" }] : /* istanbul ignore next */ []));
4681
- this._observer = signal(undefined, ...(ngDevMode ? [{ debugName: "_observer" }] : /* istanbul ignore next */ []));
4910
+ this._intersectionObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_intersectionObserverCallbackId" }] : /* istanbul ignore next */ []));
4911
+ this._resizeObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_resizeObserverCallbackId" }] : /* istanbul ignore next */ []));
4682
4912
  this._searchValue = signal(undefined, ...(ngDevMode ? [{ debugName: "_searchValue" }] : /* istanbul ignore next */ []));
4683
4913
  this.selectAllChecked = signal(false, ...(ngDevMode ? [{ debugName: "selectAllChecked" }] : /* istanbul ignore next */ []));
4684
4914
  this.selectAllIndeterminate = signal(false, ...(ngDevMode ? [{ debugName: "selectAllIndeterminate" }] : /* istanbul ignore next */ []));
4685
4915
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
4686
4916
  /** Signal Forms optional fields (Duck-Typing compatibility) */
4687
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
4917
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
4688
4918
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
4689
4919
  /** @internal Signal Forms validation state */
4690
4920
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -4693,11 +4923,15 @@ class DBCustomSelect {
4693
4923
  /** Signal Forms alias — maps to 'values' for FormValueControl duck-typing */
4694
4924
  this.value = model(...(ngDevMode ? [undefined, { debugName: "value" }] : /* istanbul ignore next */ []));
4695
4925
  /**
4696
- * @internal Tracks the origin of the last write to prevent infinite ping-pong.
4697
- * Convergence is guaranteed by Angular's signal equality check
4698
- * (setting a signal to the same value does not re-notify dependents).
4926
+ * @internal Tracks the origin of the last write to prevent redundant
4927
+ * re-processing within the same synchronous microtask.
4928
+ * NOTE: The actual infinite-loop prevention relies on Angular's signal
4929
+ * equality check (setting a signal to the same value does not re-notify).
4930
+ * This marker is an optimization to skip unnecessary array conversions.
4699
4931
  */
4700
4932
  this._syncSource = 'none';
4933
+ /** @internal Tracks whether the value alias has been explicitly bound (driven by Signal Forms). */
4934
+ this._valueAliasActive = false;
4701
4935
  /** @internal Sync value → values (Signal Forms writes to value) */
4702
4936
  this._syncValueToValues = effect(() => {
4703
4937
  const v = this.value();
@@ -4705,10 +4939,20 @@ class DBCustomSelect {
4705
4939
  this._syncSource = 'none';
4706
4940
  return;
4707
4941
  }
4942
+ // Only sync when the alias is actively driven (not initial undefined from unbound state)
4943
+ if (v === undefined && !this._valueAliasActive) {
4944
+ return;
4945
+ }
4946
+ this._valueAliasActive = true;
4708
4947
  this._syncSource = 'value';
4709
4948
  if (v !== undefined) {
4710
4949
  this.values.set(Array.isArray(v) ? v : v ? [v] : []);
4711
4950
  }
4951
+ else {
4952
+ // Reset: undefined clears the selection and resets the sync marker
4953
+ // so subsequent user interactions via 'values' are not blocked.
4954
+ this.values.set([]);
4955
+ }
4712
4956
  }, ...(ngDevMode ? [{ debugName: "_syncValueToValues" }] : /* istanbul ignore next */ []));
4713
4957
  /** @internal Sync values → value (CVA/user interaction writes to values) */
4714
4958
  this._syncValuesToValue = effect(() => {
@@ -5088,23 +5332,24 @@ class DBCustomSelect {
5088
5332
  if (typeof window !== "undefined") {
5089
5333
  this.resetIds();
5090
5334
  this._invalidMessage.set(this.invalidMessage() || DEFAULT_INVALID_MESSAGE);
5091
- if (typeof window !== "undefined" && "IntersectionObserver" in window) {
5092
- this._observer.set(new IntersectionObserver((payload) => {
5093
- if (this.detailsRef()?.nativeElement) {
5094
- const entry = payload.find(({ target }) => target === this.detailsRef()?.nativeElement);
5095
- if (entry &&
5096
- !entry.isIntersecting &&
5097
- this.detailsRef()?.nativeElement.open) {
5098
- this.detailsRef().nativeElement.open = false;
5099
- }
5100
- }
5101
- }));
5102
- }
5103
5335
  this.setupObserver(element);
5104
5336
  }
5105
5337
  }
5106
5338
  ngOnDestroy() {
5107
5339
  this.abortController()?.abort();
5340
+ // Clean up singleton observers if dropdown was open when unmounting
5341
+ if (this._documentClickListenerCallbackId()) {
5342
+ new DocumentClickListener().removeCallback(this._documentClickListenerCallbackId());
5343
+ }
5344
+ if (this._documentScrollListenerCallbackId()) {
5345
+ new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
5346
+ }
5347
+ if (this._resizeObserverCallbackId()) {
5348
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
5349
+ }
5350
+ if (this._intersectionObserverCallbackId()) {
5351
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
5352
+ }
5108
5353
  this.observer()?.disconnect();
5109
5354
  }
5110
5355
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBCustomSelect, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
@@ -5320,7 +5565,7 @@ class DBCustomSelect {
5320
5565
  role="status"
5321
5566
  >{{_voiceOverFallback()}}</span
5322
5567
  >
5323
- </div> `, isInline: true, styles: [":host{display:contents}:host([hidden]){display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTag, selector: "db-tag", inputs: ["removeButton", "id", "propOverrides", "className", "semantic", "emphasis", "icon", "showCheckState", "showIcon", "noText", "overflow", "text", "behavior"], outputs: ["remove"] }, { kind: "component", type: DBCustomSelectDropdown, selector: "db-custom-select-dropdown", inputs: ["id", "propOverrides", "className", "width"] }, { kind: "component", type: DBInput, selector: "db-input", inputs: ["invalidMessage", "id", "propOverrides", "dataListId", "message", "showMessage", "value", "validMessage", "validation", "required", "minLength", "maxLength", "pattern", "dataList", "className", "variant", "showLabel", "showIconLeading", "showIcon", "iconLeading", "icon", "iconTrailing", "showRequiredAsterisk", "showIconTrailing", "label", "fieldSizing", "name", "type", "multiple", "accept", "placeholder", "disabled", "step", "maxlength", "minlength", "max", "min", "readOnly", "readonly", "form", "size", "autocomplete", "autofocus", "enterkeyhint", "inputmode", "ariaDescribedBy", "messageSize", "messageIcon", "validMessageSize", "invalidMessageSize", "hidden", "errors"], outputs: ["valueChange", "disabledChange", "input", "change", "blur", "focus", "touch"] }, { kind: "component", type: DBCustomSelectList, selector: "db-custom-select-list", inputs: ["multiple", "label", "id", "propOverrides", "className"] }, { kind: "component", type: DBCustomSelectListItem, selector: "db-custom-select-list-item", inputs: ["isGroupTitle", "showDivider", "type", "checked", "id", "propOverrides", "className", "groupTitle", "icon", "showIcon", "name", "disabled", "value", "label", "hidden", "errors"], outputs: ["checkedChange", "disabledChange", "change", "touch"] }, { kind: "component", type: DBInfotext, selector: "db-infotext", inputs: ["id", "propOverrides", "className", "icon", "semantic", "size", "wrap", "showIcon", "text"] }, { kind: "component", type: DBButton, selector: "db-button", inputs: ["type", "commandfor", "id", "propOverrides", "className", "disabled", "iconLeading", "icon", "showIconLeading", "showIcon", "iconTrailing", "showIconTrailing", "size", "width", "variant", "wrap", "noText", "name", "form", "value", "command", "text"], outputs: ["click"] }, { kind: "component", type: DBTooltip, selector: "db-tooltip", inputs: ["id", "propOverrides", "variant", "placement", "className", "emphasis", "wrap", "animation", "delay", "width", "showArrow", "text"] }] }); }
5568
+ </div> `, isInline: true, styles: [":host{display:contents}:host([hidden]){display:none!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBTag, selector: "db-tag", inputs: ["removeButton", "id", "propOverrides", "className", "semantic", "emphasis", "icon", "showCheckState", "showIcon", "noText", "overflow", "text", "behavior"], outputs: ["remove"] }, { kind: "component", type: DBCustomSelectDropdown, selector: "db-custom-select-dropdown", inputs: ["id", "propOverrides", "className", "width"] }, { kind: "component", type: DBInput, selector: "db-input", inputs: ["invalidMessage", "id", "propOverrides", "dataListId", "message", "showMessage", "value", "validMessage", "validation", "required", "minLength", "maxLength", "pattern", "dataList", "className", "variant", "showLabel", "showIconLeading", "showIcon", "iconLeading", "icon", "iconTrailing", "showRequiredAsterisk", "showIconTrailing", "label", "fieldSizing", "name", "type", "multiple", "accept", "placeholder", "disabled", "step", "maxlength", "minlength", "max", "min", "readOnly", "readonly", "form", "size", "autocomplete", "autofocus", "enterkeyhint", "inputmode", "ariaDescribedBy", "messageSize", "messageIcon", "validMessageSize", "invalidMessageSize", "hidden", "errors"], outputs: ["valueChange", "disabledChange", "input", "change", "blur", "focus", "touch"] }, { kind: "component", type: DBCustomSelectList, selector: "db-custom-select-list", inputs: ["multiple", "label", "id", "propOverrides", "className"] }, { kind: "component", type: DBCustomSelectListItem, selector: "db-custom-select-list-item", inputs: ["isGroupTitle", "showDivider", "type", "checked", "id", "propOverrides", "className", "groupTitle", "icon", "showIcon", "name", "disabled", "value", "label", "hidden", "errors"], outputs: ["checkedChange", "disabledChange", "change", "touch"] }, { kind: "component", type: DBInfotext, selector: "db-infotext", inputs: ["id", "propOverrides", "className", "icon", "semantic", "size", "wrap", "showIcon", "text"] }, { kind: "component", type: DBButton, selector: "db-button", inputs: ["type", "commandfor", "id", "propOverrides", "className", "disabled", "iconLeading", "icon", "showIconLeading", "showIcon", "iconTrailing", "showIconTrailing", "size", "width", "variant", "wrap", "noText", "name", "form", "value", "command", "text"], outputs: ["click"] }, { kind: "component", type: DBTooltip, selector: "db-tooltip", inputs: ["id", "propOverrides", "variant", "className", "emphasis", "wrap", "animation", "delay", "width", "showArrow", "placement", "text"] }] }); }
5324
5569
  }
5325
5570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBCustomSelect, decorators: [{
5326
5571
  type: Component,
@@ -7501,7 +7746,7 @@ class DBPopover {
7501
7746
  if (article) {
7502
7747
  // This is a workaround for angular
7503
7748
  void delay(() => {
7504
- handleFixedPopover(article, this._ref()?.nativeElement, this.placement() ?? "bottom");
7749
+ handleFixedPopover(article, this._ref()?.nativeElement);
7505
7750
  }, 1);
7506
7751
  }
7507
7752
  }
@@ -7513,11 +7758,29 @@ class DBPopover {
7513
7758
  }
7514
7759
  handleEnter() {
7515
7760
  this.isExpanded.set(true);
7761
+ // Clean up any existing observers to prevent leaks from repeated enter
7762
+ if (this._documentScrollListenerCallbackId()) {
7763
+ new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
7764
+ this._documentScrollListenerCallbackId.set(undefined);
7765
+ }
7766
+ if (this._resizeObserverCallbackId()) {
7767
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
7768
+ this._resizeObserverCallbackId.set(undefined);
7769
+ }
7770
+ if (this._intersectionObserverCallbackId()) {
7771
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
7772
+ this._intersectionObserverCallbackId.set(undefined);
7773
+ }
7516
7774
  this._documentScrollListenerCallbackId.set(new DocumentScrollListener().addCallback((event) => this.handleDocumentScroll(event)));
7517
7775
  this.handleAutoPlacement();
7776
+ this._resizeObserverCallbackId.set(new ResizeObserverListener().observe(document.documentElement, () => this.handleAutoPlacement()));
7518
7777
  const child = this.getTrigger();
7519
7778
  if (child) {
7520
- this._observer()?.observe(child);
7779
+ this._intersectionObserverCallbackId.set(new IntersectionObserverListener().observe(child, (entry) => {
7780
+ if (!entry.isIntersecting) {
7781
+ this.handleEscape(false);
7782
+ }
7783
+ }));
7521
7784
  }
7522
7785
  }
7523
7786
  handleLeave(event) {
@@ -7530,10 +7793,15 @@ class DBPopover {
7530
7793
  this.isExpanded.set(false);
7531
7794
  if (this._documentScrollListenerCallbackId()) {
7532
7795
  new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
7796
+ this._documentScrollListenerCallbackId.set(undefined);
7797
+ }
7798
+ if (this._resizeObserverCallbackId()) {
7799
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
7800
+ this._resizeObserverCallbackId.set(undefined);
7533
7801
  }
7534
- const child = this.getTrigger();
7535
- if (child) {
7536
- this._observer()?.unobserve(child);
7802
+ if (this._intersectionObserverCallbackId()) {
7803
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
7804
+ this._intersectionObserverCallbackId.set(undefined);
7537
7805
  }
7538
7806
  }
7539
7807
  }
@@ -7577,7 +7845,6 @@ class DBPopover {
7577
7845
  constructor() {
7578
7846
  this.cls = cls;
7579
7847
  this.getBooleanAsString = getBooleanAsString;
7580
- this.placement = input(...(ngDevMode ? [undefined, { debugName: "placement" }] : /* istanbul ignore next */ []));
7581
7848
  this.id = input(...(ngDevMode ? [undefined, { debugName: "id" }] : /* istanbul ignore next */ []));
7582
7849
  this.propOverrides = input(...(ngDevMode ? [undefined, { debugName: "propOverrides" }] : /* istanbul ignore next */ []));
7583
7850
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
@@ -7587,11 +7854,13 @@ class DBPopover {
7587
7854
  this.open = input(...(ngDevMode ? [undefined, { debugName: "open" }] : /* istanbul ignore next */ []));
7588
7855
  this.delay = input(...(ngDevMode ? [undefined, { debugName: "delay" }] : /* istanbul ignore next */ []));
7589
7856
  this.width = input(...(ngDevMode ? [undefined, { debugName: "width" }] : /* istanbul ignore next */ []));
7857
+ this.placement = input(...(ngDevMode ? [undefined, { debugName: "placement" }] : /* istanbul ignore next */ []));
7590
7858
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
7591
7859
  this.initialized = signal(false, ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
7592
7860
  this.isExpanded = signal(false, ...(ngDevMode ? [{ debugName: "isExpanded" }] : /* istanbul ignore next */ []));
7593
7861
  this._documentScrollListenerCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_documentScrollListenerCallbackId" }] : /* istanbul ignore next */ []));
7594
- this._observer = signal(undefined, ...(ngDevMode ? [{ debugName: "_observer" }] : /* istanbul ignore next */ []));
7862
+ this._intersectionObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_intersectionObserverCallbackId" }] : /* istanbul ignore next */ []));
7863
+ this._resizeObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_resizeObserverCallbackId" }] : /* istanbul ignore next */ []));
7595
7864
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
7596
7865
  if (typeof window !== "undefined") {
7597
7866
  effect(() => {
@@ -7613,15 +7882,6 @@ class DBPopover {
7613
7882
  ["mouseleave", "focusout"].forEach((event) => {
7614
7883
  this._ref()?.nativeElement.addEventListener(event, () => this.handleLeave());
7615
7884
  });
7616
- if (typeof window !== "undefined" &&
7617
- "IntersectionObserver" in window) {
7618
- this._observer.set(new IntersectionObserver((payload) => {
7619
- const entry = payload.find(({ target }) => target === this.getTrigger());
7620
- if (entry && !entry.isIntersecting) {
7621
- this.handleEscape(false);
7622
- }
7623
- }));
7624
- }
7625
7885
  }
7626
7886
  }, Number(VERSION.major) < 19
7627
7887
  ? { allowSignalWrites: true }
@@ -7692,10 +7952,22 @@ class DBPopover {
7692
7952
  }
7693
7953
  }
7694
7954
  ngOnDestroy() {
7955
+ if (this._documentScrollListenerCallbackId()) {
7956
+ new DocumentScrollListener().removeCallback(this._documentScrollListenerCallbackId());
7957
+ this._documentScrollListenerCallbackId.set(undefined);
7958
+ }
7959
+ if (this._resizeObserverCallbackId()) {
7960
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
7961
+ this._resizeObserverCallbackId.set(undefined);
7962
+ }
7963
+ if (this._intersectionObserverCallbackId()) {
7964
+ new IntersectionObserverListener().unobserve(this._intersectionObserverCallbackId());
7965
+ this._intersectionObserverCallbackId.set(undefined);
7966
+ }
7695
7967
  this.observer()?.disconnect();
7696
7968
  }
7697
7969
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBPopover, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7698
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBPopover, isStandalone: true, selector: "db-popover", inputs: { placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
7970
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.2.17", type: DBPopover, isStandalone: true, selector: "db-popover", inputs: { id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, spacing: { classPropertyName: "spacing", publicName: "spacing", isSignal: true, isRequired: false, transformFunction: null }, gap: { classPropertyName: "gap", publicName: "gap", isSignal: true, isRequired: false, transformFunction: null }, animation: { classPropertyName: "animation", publicName: "animation", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, delay: { classPropertyName: "delay", publicName: "delay", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "placement", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
7699
7971
  #_ref
7700
7972
  [attr.id]="id() ?? propOverrides()?.id"
7701
7973
  [class]="cls('db-popover', className())"
@@ -7736,7 +8008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
7736
8008
  <ng-content></ng-content>
7737
8009
  </article>
7738
8010
  </div> `, styles: [":host{display:contents}\n"] }]
7739
- }], ctorParameters: () => [], propDecorators: { placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
8011
+ }], ctorParameters: () => [], propDecorators: { id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], spacing: [{ type: i0.Input, args: [{ isSignal: true, alias: "spacing", required: false }] }], gap: [{ type: i0.Input, args: [{ isSignal: true, alias: "gap", required: false }] }], animation: [{ type: i0.Input, args: [{ isSignal: true, alias: "animation", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }], delay: [{ type: i0.Input, args: [{ isSignal: true, alias: "delay", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "placement", required: false }] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
7740
8012
 
7741
8013
  const defaultProps$h = {};
7742
8014
  class DBRadio {
@@ -7819,7 +8091,7 @@ class DBRadio {
7819
8091
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
7820
8092
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
7821
8093
  /** Signal Forms optional fields (Duck-Typing compatibility) */
7822
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
8094
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
7823
8095
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
7824
8096
  /** Signal Forms touch output — emitted on blur to mark the control as touched */
7825
8097
  this.touch = output();
@@ -8352,7 +8624,7 @@ class DBSelect {
8352
8624
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
8353
8625
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
8354
8626
  /** Signal Forms optional fields (Duck-Typing compatibility) */
8355
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
8627
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
8356
8628
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
8357
8629
  /** @internal Signal Forms validation state */
8358
8630
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -9056,7 +9328,7 @@ class DBSwitch {
9056
9328
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
9057
9329
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
9058
9330
  /** Signal Forms optional fields (Duck-Typing compatibility) */
9059
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
9331
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9060
9332
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
9061
9333
  /** @internal Signal Forms validation state */
9062
9334
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -9420,7 +9692,7 @@ class DBTabItem {
9420
9692
  this.boundSetSelectedOnChange = signal(undefined, ...(ngDevMode ? [{ debugName: "boundSetSelectedOnChange" }] : /* istanbul ignore next */ []));
9421
9693
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
9422
9694
  /** Signal Forms optional fields (Duck-Typing compatibility) */
9423
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
9695
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
9424
9696
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
9425
9697
  /** Signal Forms touch output — emitted on blur to mark the control as touched */
9426
9698
  this.touch = output();
@@ -10971,13 +11243,13 @@ class DBTabs {
10971
11243
  container.addEventListener("scroll", () => {
10972
11244
  this.evaluateScrollButtons(container);
10973
11245
  });
10974
- // Use ResizeObserver to re-evaluate scroll buttons because it provides more accurate, container-specific resize detection than global window resize events.
10975
- if (!this._resizeObserver()) {
10976
- const observer = new ResizeObserver(() => {
11246
+ // Re-evaluate scroll buttons on container resize because it
11247
+ // provides more accurate, container-specific resize
11248
+ // detection than global window resize events.
11249
+ if (!this._resizeObserverCallbackId()) {
11250
+ this._resizeObserverCallbackId.set(new ResizeObserverListener().observe(container, () => {
10977
11251
  this.evaluateScrollButtons(container);
10978
- });
10979
- observer.observe(container);
10980
- this._resizeObserver.set(observer);
11252
+ }));
10981
11253
  }
10982
11254
  }
10983
11255
  }
@@ -10986,7 +11258,7 @@ class DBTabs {
10986
11258
  }
10987
11259
  initTabs(init) {
10988
11260
  if (this._ref()?.nativeElement) {
10989
- const tabItems = Array.from(this._ref()?.nativeElement.getElementsByClassName("db-tab-item"));
11261
+ const tabItems = Array.from(this._ref()?.nativeElement.querySelectorAll(":is(:scope > db-tab-list .db-tab-item, :scope > .db-tab-list .db-tab-item)"));
10990
11262
  const tabPanels = Array.from(this._ref()?.nativeElement.querySelectorAll(":is(:scope > .db-tab-panel, :scope > db-tab-panel > .db-tab-panel)"));
10991
11263
  for (const tabItem of tabItems) {
10992
11264
  const index = tabItems.indexOf(tabItem);
@@ -11074,6 +11346,8 @@ class DBTabs {
11074
11346
  }
11075
11347
  constructor() {
11076
11348
  this.cls = cls;
11349
+ this.DEFAULT_SCROLL_LEFT = DEFAULT_SCROLL_LEFT;
11350
+ this.DEFAULT_SCROLL_RIGHT = DEFAULT_SCROLL_RIGHT;
11077
11351
  this.name = input(...(ngDevMode ? [undefined, { debugName: "name" }] : /* istanbul ignore next */ []));
11078
11352
  this.tabs = input(...(ngDevMode ? [undefined, { debugName: "tabs" }] : /* istanbul ignore next */ []));
11079
11353
  this.arrowScrollDistance = input(...(ngDevMode ? [undefined, { debugName: "arrowScrollDistance" }] : /* istanbul ignore next */ []));
@@ -11086,6 +11360,8 @@ class DBTabs {
11086
11360
  this.className = input(...(ngDevMode ? [undefined, { debugName: "className" }] : /* istanbul ignore next */ []));
11087
11361
  this.alignment = input(...(ngDevMode ? [undefined, { debugName: "alignment" }] : /* istanbul ignore next */ []));
11088
11362
  this.width = input(...(ngDevMode ? [undefined, { debugName: "width" }] : /* istanbul ignore next */ []));
11363
+ this.scrollLeftText = input(...(ngDevMode ? [undefined, { debugName: "scrollLeftText" }] : /* istanbul ignore next */ []));
11364
+ this.scrollRightText = input(...(ngDevMode ? [undefined, { debugName: "scrollRightText" }] : /* istanbul ignore next */ []));
11089
11365
  this.indexChange = output();
11090
11366
  this.tabSelect = output();
11091
11367
  this._ref = viewChild("_ref", ...(ngDevMode ? [{ debugName: "_ref" }] : /* istanbul ignore next */ []));
@@ -11094,7 +11370,7 @@ class DBTabs {
11094
11370
  this.showScrollLeft = signal(false, ...(ngDevMode ? [{ debugName: "showScrollLeft" }] : /* istanbul ignore next */ []));
11095
11371
  this.showScrollRight = signal(false, ...(ngDevMode ? [{ debugName: "showScrollRight" }] : /* istanbul ignore next */ []));
11096
11372
  this.scrollContainer = signal(null, ...(ngDevMode ? [{ debugName: "scrollContainer" }] : /* istanbul ignore next */ []));
11097
- this._resizeObserver = signal(undefined, ...(ngDevMode ? [{ debugName: "_resizeObserver" }] : /* istanbul ignore next */ []));
11373
+ this._resizeObserverCallbackId = signal(undefined, ...(ngDevMode ? [{ debugName: "_resizeObserverCallbackId" }] : /* istanbul ignore next */ []));
11098
11374
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
11099
11375
  if (typeof window !== "undefined") {
11100
11376
  effect(() => {
@@ -11179,12 +11455,14 @@ class DBTabs {
11179
11455
  }
11180
11456
  }
11181
11457
  ngOnDestroy() {
11182
- this._resizeObserver()?.disconnect();
11183
- this._resizeObserver.set(undefined);
11458
+ if (this._resizeObserverCallbackId()) {
11459
+ new ResizeObserverListener().unobserve(this._resizeObserverCallbackId());
11460
+ this._resizeObserverCallbackId.set(undefined);
11461
+ }
11184
11462
  this.observer()?.disconnect();
11185
11463
  }
11186
11464
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: DBTabs, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
11187
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTabs, isStandalone: true, selector: "db-tabs", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, arrowScrollDistance: { classPropertyName: "arrowScrollDistance", publicName: "arrowScrollDistance", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, behavior: { classPropertyName: "behavior", publicName: "behavior", isSignal: true, isRequired: false, transformFunction: null }, initialSelectedMode: { classPropertyName: "initialSelectedMode", publicName: "initialSelectedMode", isSignal: true, isRequired: false, transformFunction: null }, initialSelectedIndex: { classPropertyName: "initialSelectedIndex", publicName: "initialSelectedIndex", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", tabSelect: "tabSelect" }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
11465
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: DBTabs, isStandalone: true, selector: "db-tabs", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, tabs: { classPropertyName: "tabs", publicName: "tabs", isSignal: true, isRequired: false, transformFunction: null }, arrowScrollDistance: { classPropertyName: "arrowScrollDistance", publicName: "arrowScrollDistance", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, behavior: { classPropertyName: "behavior", publicName: "behavior", isSignal: true, isRequired: false, transformFunction: null }, initialSelectedMode: { classPropertyName: "initialSelectedMode", publicName: "initialSelectedMode", isSignal: true, isRequired: false, transformFunction: null }, initialSelectedIndex: { classPropertyName: "initialSelectedIndex", publicName: "initialSelectedIndex", isSignal: true, isRequired: false, transformFunction: null }, id: { classPropertyName: "id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, propOverrides: { classPropertyName: "propOverrides", publicName: "propOverrides", isSignal: true, isRequired: false, transformFunction: null }, className: { classPropertyName: "className", publicName: "className", isSignal: true, isRequired: false, transformFunction: null }, alignment: { classPropertyName: "alignment", publicName: "alignment", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, scrollLeftText: { classPropertyName: "scrollLeftText", publicName: "scrollLeftText", isSignal: true, isRequired: false, transformFunction: null }, scrollRightText: { classPropertyName: "scrollRightText", publicName: "scrollRightText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { indexChange: "indexChange", tabSelect: "tabSelect" }, viewQueries: [{ propertyName: "_ref", first: true, predicate: ["_ref"], descendants: true, isSignal: true }], ngImport: i0, template: `<div
11188
11466
  #_ref
11189
11467
  [attr.id]="id() ?? propOverrides()?.id"
11190
11468
  [class]="cls('db-tabs', className())"
@@ -11200,12 +11478,11 @@ class DBTabs {
11200
11478
  variant="ghost"
11201
11479
  icon="chevron_left"
11202
11480
  type="button"
11203
- className="tabs-scroll-left"
11481
+ className="overflow-scroll-left-button"
11204
11482
  [noText]="true"
11205
11483
  (click)="scroll(true)"
11484
+ >{{scrollLeftText() ?? DEFAULT_SCROLL_LEFT}}</db-button
11206
11485
  >
11207
- Scroll left
11208
- </db-button>
11209
11486
  } @if(tabs()){
11210
11487
  <db-tab-list>
11211
11488
  @for (tab of convertTabs();track trackByTab0(index, tab);let index =
@@ -11228,12 +11505,11 @@ class DBTabs {
11228
11505
  variant="ghost"
11229
11506
  icon="chevron_right"
11230
11507
  type="button"
11231
- className="tabs-scroll-right"
11508
+ className="overflow-scroll-right-button"
11232
11509
  [noText]="true"
11233
11510
  (click)="scroll()"
11511
+ >{{scrollRightText() ?? DEFAULT_SCROLL_RIGHT}}</db-button
11234
11512
  >
11235
- Scroll right
11236
- </db-button>
11237
11513
  }
11238
11514
  <ng-content></ng-content>
11239
11515
  </div> `, isInline: true, styles: [":host{display:contents}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DBButton, selector: "db-button", inputs: ["type", "commandfor", "id", "propOverrides", "className", "disabled", "iconLeading", "icon", "showIconLeading", "showIcon", "iconTrailing", "showIconTrailing", "size", "width", "variant", "wrap", "noText", "name", "form", "value", "command", "text"], outputs: ["click"] }, { kind: "component", type: DBTabList, selector: "db-tab-list", inputs: ["id", "propOverrides", "className"] }, { kind: "component", type: DBTabItem, selector: "db-tab-item", inputs: ["active", "name", "className", "id", "propOverrides", "iconLeading", "icon", "iconTrailing", "showIconLeading", "showIcon", "showIconTrailing", "noText", "disabled", "checked", "label", "hidden", "errors"], outputs: ["disabledChange", "checkedChange", "change", "touch"] }, { kind: "component", type: DBTabPanel, selector: "db-tab-panel", inputs: ["className", "id", "propOverrides", "content"] }] }); }
@@ -11256,12 +11532,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
11256
11532
  variant="ghost"
11257
11533
  icon="chevron_left"
11258
11534
  type="button"
11259
- className="tabs-scroll-left"
11535
+ className="overflow-scroll-left-button"
11260
11536
  [noText]="true"
11261
11537
  (click)="scroll(true)"
11538
+ >{{scrollLeftText() ?? DEFAULT_SCROLL_LEFT}}</db-button
11262
11539
  >
11263
- Scroll left
11264
- </db-button>
11265
11540
  } @if(tabs()){
11266
11541
  <db-tab-list>
11267
11542
  @for (tab of convertTabs();track trackByTab0(index, tab);let index =
@@ -11284,16 +11559,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
11284
11559
  variant="ghost"
11285
11560
  icon="chevron_right"
11286
11561
  type="button"
11287
- className="tabs-scroll-right"
11562
+ className="overflow-scroll-right-button"
11288
11563
  [noText]="true"
11289
11564
  (click)="scroll()"
11565
+ >{{scrollRightText() ?? DEFAULT_SCROLL_RIGHT}}</db-button
11290
11566
  >
11291
- Scroll right
11292
- </db-button>
11293
11567
  }
11294
11568
  <ng-content></ng-content>
11295
11569
  </div> `, styles: [":host{display:contents}\n"] }]
11296
- }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], arrowScrollDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowScrollDistance", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], behavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "behavior", required: false }] }], initialSelectedMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelectedMode", required: false }] }], initialSelectedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelectedIndex", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], tabSelect: [{ type: i0.Output, args: ["tabSelect"] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
11570
+ }], ctorParameters: () => [], propDecorators: { name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], tabs: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabs", required: false }] }], arrowScrollDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "arrowScrollDistance", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], behavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "behavior", required: false }] }], initialSelectedMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelectedMode", required: false }] }], initialSelectedIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialSelectedIndex", required: false }] }], id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], propOverrides: [{ type: i0.Input, args: [{ isSignal: true, alias: "propOverrides", required: false }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], scrollLeftText: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollLeftText", required: false }] }], scrollRightText: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollRightText", required: false }] }], indexChange: [{ type: i0.Output, args: ["indexChange"] }], tabSelect: [{ type: i0.Output, args: ["tabSelect"] }], _ref: [{ type: i0.ViewChild, args: ["_ref", { isSignal: true }] }] } });
11297
11571
 
11298
11572
  const TabsBehaviorList = ['scrollbar', 'arrows'];
11299
11573
  const TabsInitialSelectedModeList = ['auto', 'manually'];
@@ -11493,7 +11767,7 @@ class DBTextarea {
11493
11767
  this.abortController = signal(undefined, ...(ngDevMode ? [{ debugName: "abortController" }] : /* istanbul ignore next */ []));
11494
11768
  this.observer = signal(undefined, ...(ngDevMode ? [{ debugName: "observer" }] : /* istanbul ignore next */ []));
11495
11769
  /** Signal Forms optional fields (Duck-Typing compatibility) */
11496
- this.hidden = input(false, ...(ngDevMode ? [{ debugName: "hidden" }] : /* istanbul ignore next */ []));
11770
+ this.hidden = input(false, { ...(ngDevMode ? { debugName: "hidden" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
11497
11771
  this.errors = input(undefined, ...(ngDevMode ? [{ debugName: "errors" }] : /* istanbul ignore next */ []));
11498
11772
  /** @internal Signal Forms validation state */
11499
11773
  this._validMessage = signal('', ...(ngDevMode ? [{ debugName: "_validMessage" }] : /* istanbul ignore next */ []));
@@ -11841,5 +12115,5 @@ const AlignmentList = ['start', 'center', 'end'];
11841
12115
  * Generated bundle index. Do not edit.
11842
12116
  */
11843
12117
 
11844
- export { AccordionBehaviorList, AccordionVariantList, AlignmentList, AutoCompleteList, BadgePlacementList, ButtonTypeList, ButtonVariantList, COLOR, COLORS, COLORS_SIMPLE, COLOR_CONST, COLOR_SIMPLE, CardBehaviorList, CardElevationLevelList, CustomSelectDropdownWidthList, CustomSelectListItemTypeList, DBAccordion, DBAccordionItem, DBBadge, DBBrand, DBButton, DBCard, DBCheckbox, DBCustomButton, DBCustomSelect, DBCustomSelectDropdown, DBCustomSelectFormField, DBCustomSelectList, DBCustomSelectListItem, DBDivider, DBDrawer, DBHeader, DBIcon, DBInfotext, DBInput, DBLink, DBNavigation, DBNavigationItem, DBNotification, DBPage, DBPopover, DBRadio, DBSection, DBSelect, DBStack, DBSwitch, DBTabItem, DBTabList, DBTabPanel, DBTable, DBTableBody, DBTableCaption, DBTableColumnsSizeList, DBTableDataCell, DBTableDividerList, DBTableFooter, DBTableHead, DBTableHeaderCell, DBTableHeaderCellScopeList, DBTableMobileVariantList, DBTableRow, DBTableRowSizeList, DBTableRowSubHeaderEmphasisList, DBTableStickyHeaderList, DBTableVariantList, DBTabs, DBTag, DBTextarea, DBTooltip, DB_UX_LOCAL_STORAGE_FRAMEWORK, DB_UX_LOCAL_STORAGE_MODE, DEFAULT_BACK, DEFAULT_BURGER_MENU, DEFAULT_CLOSE_BUTTON, DEFAULT_DATALIST_ID_SUFFIX, DEFAULT_ICON, DEFAULT_ID, DEFAULT_INVALID_MESSAGE, DEFAULT_INVALID_MESSAGE_ID_SUFFIX, DEFAULT_LABEL, DEFAULT_LABEL_ID_SUFFIX, DEFAULT_MESSAGE, DEFAULT_MESSAGE_ID_SUFFIX, DEFAULT_PLACEHOLDER, DEFAULT_PLACEHOLDER_ID_SUFFIX, DEFAULT_REMOVE, DEFAULT_ROWS, DEFAULT_SELECTED, DEFAULT_SELECT_ID_SUFFIX, DEFAULT_VALID_MESSAGE, DEFAULT_VALID_MESSAGE_ID_SUFFIX, DEFAULT_VIEWPORT, DENSITIES, DENSITY, DENSITY_CONST, DESKTOP_VIEWPORT, DividerMarginList, DividerVariantList, DocumentClickListener, DocumentScrollListener, DrawerBackdropList, DrawerDirectionList, DrawerPositionList, DrawerVariantList, EmphasisList, FieldSizingList, GapSpacingList, IconWeightList, InputTypeList, LabelVariantHorizontalList, LabelVariantList, LinkContentList, LinkReferrerPolicyList, LinkSizeList, LinkTargetList, LinkVariantList, MarginList, MaxWidthList, MetaNavigationDirective, NavigationContentDirective, NavigationDirective, NavigationItemSafeTriangle, NotificationAriaLiveList, NotificationLinkVariantList, NotificationVariantList, OrientationList, PageDocumentOverflowList, PageVariantList, PlacementHorizontalList, PlacementList, PlacementVerticalList, PopoverDelayList, PopoverWidthList, SEMANTIC, SEMANTICS, SecondaryActionDirective, SelectedTypeList, SemanticList, SizeList, SpacingList, StackAlignmentList, StackDirectionList, StackJustifyContentList, StackVariantList, TESTING_VIEWPORTS, TabsBehaviorList, TabsInitialSelectedModeList, TagBehaviorList, TextareaResizeList, TextareaWrapList, TooltipVariantList, ValidationList, WidthList, addAttributeToChildren, cls, delay, getBoolean, getBooleanAsString, getFloatingProps, getHideProp, getInputValue, getNotificationRole, getNumber, getOptionKey, getSearchInput, getStep, handleDataOutside, handleFixedDropdown, handleFixedPopover, hasVoiceOver, isArrayOfStrings, isEventTargetNavigationItem, isIOSSafari, isKeyboardEvent, stringPropVisible, uuid };
12118
+ export { AccordionBehaviorList, AccordionVariantList, AlignmentList, AutoCompleteList, BadgePlacementList, ButtonTypeList, ButtonVariantList, COLOR, COLORS, COLORS_SIMPLE, COLOR_CONST, COLOR_SIMPLE, CardBehaviorList, CardElevationLevelList, CustomSelectDropdownWidthList, CustomSelectListItemTypeList, DBAccordion, DBAccordionItem, DBBadge, DBBrand, DBButton, DBCard, DBCheckbox, DBCustomButton, DBCustomSelect, DBCustomSelectDropdown, DBCustomSelectFormField, DBCustomSelectList, DBCustomSelectListItem, DBDivider, DBDrawer, DBHeader, DBIcon, DBInfotext, DBInput, DBLink, DBNavigation, DBNavigationItem, DBNotification, DBPage, DBPopover, DBRadio, DBSection, DBSelect, DBStack, DBSwitch, DBTabItem, DBTabList, DBTabPanel, DBTable, DBTableBody, DBTableCaption, DBTableColumnsSizeList, DBTableDataCell, DBTableDividerList, DBTableFooter, DBTableHead, DBTableHeaderCell, DBTableHeaderCellScopeList, DBTableMobileVariantList, DBTableRow, DBTableRowSizeList, DBTableRowSubHeaderEmphasisList, DBTableStickyHeaderList, DBTableVariantList, DBTabs, DBTag, DBTextarea, DBTooltip, DB_UX_LOCAL_STORAGE_FRAMEWORK, DB_UX_LOCAL_STORAGE_MODE, DEFAULT_BACK, DEFAULT_BURGER_MENU, DEFAULT_CLOSE_BUTTON, DEFAULT_DATALIST_ID_SUFFIX, DEFAULT_ICON, DEFAULT_ID, DEFAULT_INVALID_MESSAGE, DEFAULT_INVALID_MESSAGE_ID_SUFFIX, DEFAULT_LABEL, DEFAULT_LABEL_ID_SUFFIX, DEFAULT_MESSAGE, DEFAULT_MESSAGE_ID_SUFFIX, DEFAULT_PLACEHOLDER, DEFAULT_PLACEHOLDER_ID_SUFFIX, DEFAULT_REMOVE, DEFAULT_ROWS, DEFAULT_SCROLL_LEFT, DEFAULT_SCROLL_RIGHT, DEFAULT_SELECTED, DEFAULT_SELECT_ID_SUFFIX, DEFAULT_VALID_MESSAGE, DEFAULT_VALID_MESSAGE_ID_SUFFIX, DEFAULT_VIEWPORT, DENSITIES, DENSITY, DENSITY_CONST, DESKTOP_VIEWPORT, DividerMarginList, DividerVariantList, DocumentClickListener, DocumentScrollListener, DrawerBackdropList, DrawerDirectionList, DrawerPositionList, DrawerVariantList, EmphasisList, FieldSizingList, GapSpacingList, IconWeightList, InputTypeList, LabelVariantHorizontalList, LabelVariantList, LinkContentList, LinkReferrerPolicyList, LinkSizeList, LinkTargetList, LinkVariantList, MarginList, MaxWidthList, MetaNavigationDirective, NavigationContentDirective, NavigationDirective, NavigationItemSafeTriangle, NotificationAriaLiveList, NotificationLinkVariantList, NotificationVariantList, OrientationList, PageDocumentOverflowList, PageVariantList, PlacementHorizontalList, PlacementList, PlacementVerticalList, PopoverDelayList, PopoverWidthList, SEMANTIC, SEMANTICS, SecondaryActionDirective, SelectedTypeList, SemanticList, SizeList, SpacingList, StackAlignmentList, StackDirectionList, StackJustifyContentList, StackVariantList, TESTING_VIEWPORTS, TabsBehaviorList, TabsInitialSelectedModeList, TagBehaviorList, TextareaResizeList, TextareaWrapList, TooltipVariantList, ValidationList, WidthList, addAttributeToChildren, cls, delay, getBoolean, getBooleanAsString, getFloatingProps, getHideProp, getInputValue, getNotificationRole, getNumber, getOptionKey, getSearchInput, getStep, handleDataOutside, handleFixedDropdown, handleFixedPopover, hasVoiceOver, isArrayOfStrings, isEventTargetNavigationItem, isIOSSafari, isKeyboardEvent, stringPropVisible, uuid };
11845
12119
  //# sourceMappingURL=db-ux-ngx-core-components.mjs.map