@a.nemreen/dga-ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,97 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { Type, Provider, OnDestroy, OnInit } from '@angular/core';
3
- import { SafeHtml } from '@angular/platform-browser';
3
+ import { SafeHtml, SafeResourceUrl } from '@angular/platform-browser';
4
4
  import { ControlValueAccessor } from '@angular/forms';
5
5
  export { ControlValueAccessor } from '@angular/forms';
6
6
  import * as _a_nemreen_dga_ui from '@a.nemreen/dga-ui';
7
7
 
8
+ /** Creative named page transitions for `dga-page-transition`. */
9
+ declare const DGA_PAGE_TRANSITION_NAMES: readonly ["fade-up", "slide-stack", "curtain-wipe", "zoom-blur", "book-flip", "circle-reveal", "shared-axis", "glitch", "iris-open", "split-reveal", "stagger-cascade", "liquid-swipe", "push-depth", "skew-slide", "bounce-in", "film-strip", "portal-warp", "ripple-expand", "origami-fold", "swipe-cards", "none"];
10
+ type DgaPageTransitionName = (typeof DGA_PAGE_TRANSITION_NAMES)[number];
11
+ /**
12
+ * Easy page / content transition wrapper.
13
+ *
14
+ * ```html
15
+ * <dga-page-transition name="fade-up">
16
+ * <router-outlet />
17
+ * </dga-page-transition>
18
+ * ```
19
+ *
20
+ * Triggers: Angular `NavigationEnd`, or a change to `key` (playground / content swap).
21
+ * Progressive enhancement: sets `view-transition-name: dga-page` so apps using
22
+ * `withViewTransitions()` get named snapshot animations. Keyframe enter runs as fallback.
23
+ * Honors `prefers-reduced-motion` and DGA a11y `reduce-motion`.
24
+ */
25
+ declare class DgaPageTransition {
26
+ private readonly host;
27
+ private readonly doc;
28
+ private readonly destroyRef;
29
+ private readonly router;
30
+ /** Named creative transition. Unknown values resolve to `none`. */
31
+ readonly name: _angular_core.InputSignal<string>;
32
+ /** Duration in milliseconds (also drives `--dga-pt-ms`). */
33
+ readonly duration: _angular_core.InputSignalWithTransform<number, unknown>;
34
+ /** Skip all motion. */
35
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
36
+ /**
37
+ * Bump this to re-play the enter animation (content swaps / gallery playground).
38
+ * For View Transition snapshots, wrap the key update in `document.startViewTransition`.
39
+ */
40
+ readonly key: _angular_core.InputSignal<string | number | null>;
41
+ readonly phase: _angular_core.WritableSignal<"idle" | "enter">;
42
+ readonly resolvedName: _angular_core.Signal<"fade-up" | "slide-stack" | "curtain-wipe" | "zoom-blur" | "book-flip" | "circle-reveal" | "shared-axis" | "glitch" | "iris-open" | "split-reveal" | "stagger-cascade" | "liquid-swipe" | "push-depth" | "skew-slide" | "bounce-in" | "film-strip" | "portal-warp" | "ripple-expand" | "origami-fold" | "swipe-cards" | "none">;
43
+ readonly durationCss: _angular_core.Signal<string>;
44
+ private htmlAttr;
45
+ private keyPrimed;
46
+ constructor();
47
+ /** Re-trigger the enter animation (e.g. from a Play control). */
48
+ play(): void;
49
+ protected onAnimationEnd(event: AnimationEvent): void;
50
+ private shouldReduceMotion;
51
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPageTransition, never>;
52
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPageTransition, "dga-page-transition", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "key": { "alias": "key"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
53
+ }
54
+
55
+ type DgaWritingEffect = 'typewriter' | 'glow';
56
+ /**
57
+ * Headline motion: typewriter reveal or soft glow / light sweep.
58
+ *
59
+ * ```html
60
+ * <dga-writing text="Hello world" effect="glow" />
61
+ * <dga-writing text="Hello world" [speed]="28" cursor />
62
+ * ```
63
+ *
64
+ * Honors `prefers-reduced-motion` and DGA a11y `reduce-motion`.
65
+ */
66
+ declare class DgaWriting {
67
+ private readonly doc;
68
+ private readonly destroyRef;
69
+ /** Full string to type / glow. */
70
+ readonly text: _angular_core.InputSignal<string>;
71
+ /** `typewriter` (default) or soft light sweep `glow`. */
72
+ readonly effect: _angular_core.InputSignal<DgaWritingEffect>;
73
+ /** Milliseconds per character (typewriter only). */
74
+ readonly speed: _angular_core.InputSignalWithTransform<number, unknown>;
75
+ /** Delay before the first character (typewriter only). */
76
+ readonly delay: _angular_core.InputSignalWithTransform<number, unknown>;
77
+ /** Blinking caret while typing (typewriter only). */
78
+ readonly cursor: _angular_core.InputSignalWithTransform<boolean, unknown>;
79
+ /** Skip motion entirely. */
80
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
81
+ readonly displayed: _angular_core.WritableSignal<string>;
82
+ readonly phase: _angular_core.WritableSignal<"idle" | "writing" | "done">;
83
+ private timer;
84
+ private charIndex;
85
+ readonly showCursor: _angular_core.Signal<boolean>;
86
+ constructor();
87
+ private start;
88
+ private tick;
89
+ private clearTimer;
90
+ private shouldReduceMotion;
91
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaWriting, never>;
92
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaWriting, "dga-writing", never, { "text": { "alias": "text"; "required": true; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "speed": { "alias": "speed"; "required": false; "isSignal": true; }; "delay": { "alias": "delay"; "required": false; "isSignal": true; }; "cursor": { "alias": "cursor"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
93
+ }
94
+
8
95
  type DgaButtonVariant = 'primary' | 'secondary' | 'subtle' | 'outline' | 'outlineMuted' | 'outlineInverse' | 'ghost' | 'danger' | 'inverse';
9
96
  type DgaButtonSize = 'sm' | 'md' | 'lg';
10
97
  declare class DgaButton {
@@ -60,6 +147,34 @@ declare class DgaChip {
60
147
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaChip, "dga-chip", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "removable": { "alias": "removable"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; }, { "removed": "removed"; }, never, ["*"], true, never>;
61
148
  }
62
149
 
150
+ /**
151
+ * Keyboard key badge — mirrors shadcn `Kbd` for shortcut hints.
152
+ *
153
+ * @see https://ui.shadcn.com/docs/components/base/kbd
154
+ *
155
+ * @example
156
+ * ```html
157
+ * <dga-kbd>Ctrl</dga-kbd>
158
+ * <dga-kbd-group>
159
+ * <dga-kbd>⌘</dga-kbd>
160
+ * <dga-kbd>K</dga-kbd>
161
+ * </dga-kbd-group>
162
+ * ```
163
+ */
164
+ declare class DgaKbd {
165
+ readonly size: _angular_core.InputSignal<"sm" | "md">;
166
+ readonly classes: _angular_core.Signal<string>;
167
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaKbd, never>;
168
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaKbd, "dga-kbd", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
169
+ }
170
+ /**
171
+ * Groups related keyboard keys (e.g. ⌘ + K).
172
+ */
173
+ declare class DgaKbdGroup {
174
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaKbdGroup, never>;
175
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaKbdGroup, "dga-kbd-group", never, {}, {}, never, ["*"], true, never>;
176
+ }
177
+
63
178
  type DgaDividerOrientation = 'horizontal' | 'vertical';
64
179
  declare class DgaDivider {
65
180
  readonly orientation: _angular_core.InputSignal<DgaDividerOrientation>;
@@ -138,7 +253,7 @@ declare class DgaProgress {
138
253
  readonly circumference: number;
139
254
  readonly clamped: _angular_core.Signal<number>;
140
255
  readonly dashOffset: _angular_core.Signal<number>;
141
- readonly hostClasses: _angular_core.Signal<"block w-full" | "inline-flex">;
256
+ readonly hostClasses: _angular_core.Signal<"inline-flex" | "block w-full">;
142
257
  readonly trackClasses: _angular_core.Signal<string>;
143
258
  readonly barClasses: _angular_core.Signal<string>;
144
259
  readonly radialWrapClasses: _angular_core.Signal<string>;
@@ -160,14 +275,18 @@ declare class DgaAvatar {
160
275
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAvatar, "dga-avatar", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
161
276
  }
162
277
 
163
- type DgaIconName = 'access' | 'check' | 'close' | 'info' | 'helpCircle' | 'warning' | 'alertCircle' | 'error' | 'eye' | 'eyeOff' | 'eyeOffSlash' | 'success' | 'checkCircle' | 'checkCircleAlt' | 'chevronDown' | 'chevronLeft' | 'chevronRight' | 'arrowUp' | 'arrowDown' | 'arrowLeft' | 'arrowRight' | 'arrowUp02' | 'arrowDown02' | 'arrowLeft02' | 'arrowRight02' | 'arrowNext' | 'arrowPrev' | 'arrowNext02' | 'arrowPrev02' | 'shrink' | 'search' | 'user' | 'users' | 'menu' | 'menuAlt' | 'moreHorizontal' | 'moreVertical' | 'mic' | 'home' | 'download' | 'upload' | 'calendar' | 'calendarAlt' | 'clock' | 'star' | 'starFilled' | 'plus' | 'plusSign' | 'minus' | 'external' | 'bell' | 'bellAlt' | 'lock' | 'lockPassword' | 'logout' | 'idCard' | 'link' | 'linkAlt' | 'globe' | 'moon' | 'moonAlt' | 'sun' | 'sunAlt' | 'translation' | 'mail' | 'message' | 'phone' | 'building' | 'share' | 'refresh' | 'highlighter' | 'door' | 'zoomIn' | 'zoomOut' | 'sort' | 'sortUp' | 'sortDown' | 'tradeUp' | 'tradeDown' | 'paintBoard' | 'cloud' | 'sunCloud' | 'moonCloud' | 'rain' | 'rainZap' | 'snow' | 'wind' | 'desert' | 'cart' | 'award' | 'cookie' | 'x' | 'linkedin' | 'whatsapp' | 'book' | 'headphones' | 'devices' | 'badgeCheck' | 'riyal' | 'copy' | 'location' | 'folder' | 'printer' | 'instagram' | 'smartphone' | 'ambulance' | 'police' | 'fire' | 'facebook' | 'youtube' | 'apple' | 'playStore' | 'huawei' | 'textFont' | 'glasses' | 'heading' | 'mask' | 'pause' | 'textAlign' | 'letterSpacing' | 'textUnderline' | 'maximize' | 'colors' | 'colorPicker' | 'droplet' | 'disability' | 'wheelchair' | 'brain' | 'flash' | 'touch';
164
- /** Decode `@platformscode/icons` data-URI exports into inline SVG markup. */
165
- declare function decodePlatformscodeSvg(dataUri: string): string;
166
- /** Pre-decoded SVG markup keyed by friendly `DgaIconName`. */
278
+ /**
279
+ * Curated inline icons for `@a.nemreen/dga-ui` chrome (buttons, fields, menus, …).
280
+ * SVGs are vendored at build time — no runtime `@platformscode/icons` dependency.
281
+ *
282
+ * Content / editorial icons: opt into `@a.nemreen/dga-tokens/styles/icon-font.css` and use
283
+ * `<dga-icon glyph="search-01" />` (or `hgi-stroke hgi-{name}` classes).
284
+ *
285
+ * Regenerated by: node scripts/vendor-dga-icons.mjs
286
+ */
287
+ type DgaIconName = 'access' | 'check' | 'close' | 'info' | 'helpCircle' | 'warning' | 'alertCircle' | 'error' | 'eye' | 'eyeOff' | 'eyeOffSlash' | 'filter' | 'success' | 'checkCircle' | 'checkCircleAlt' | 'chevronDown' | 'chevronLeft' | 'chevronRight' | 'arrowUp' | 'arrowDown' | 'arrowLeft' | 'arrowRight' | 'arrowUp02' | 'arrowDown02' | 'arrowLeft02' | 'arrowRight02' | 'arrowNext' | 'arrowPrev' | 'arrowNext02' | 'arrowPrev02' | 'shrink' | 'search' | 'user' | 'users' | 'menu' | 'menuAlt' | 'moreHorizontal' | 'moreVertical' | 'mic' | 'home' | 'download' | 'upload' | 'calendar' | 'calendarAlt' | 'clock' | 'star' | 'starFilled' | 'plus' | 'plusSign' | 'minus' | 'external' | 'bell' | 'bellAlt' | 'lock' | 'lockPassword' | 'logout' | 'idCard' | 'link' | 'linkAlt' | 'globe' | 'moon' | 'moonAlt' | 'sun' | 'sunAlt' | 'translation' | 'mail' | 'message' | 'phone' | 'building' | 'share' | 'refresh' | 'highlighter' | 'door' | 'zoomIn' | 'zoomOut' | 'sort' | 'sortUp' | 'sortDown' | 'tradeUp' | 'tradeDown' | 'paintBoard' | 'cloud' | 'sunCloud' | 'moonCloud' | 'rain' | 'rainZap' | 'snow' | 'wind' | 'desert' | 'cart' | 'award' | 'cookie' | 'x' | 'linkedin' | 'whatsapp' | 'book' | 'headphones' | 'devices' | 'badgeCheck' | 'riyal' | 'copy' | 'location' | 'folder' | 'printer' | 'instagram' | 'smartphone' | 'ambulance' | 'police' | 'fire' | 'facebook' | 'youtube' | 'apple' | 'playStore' | 'huawei' | 'textFont' | 'glasses' | 'heading' | 'mask' | 'pause' | 'textAlign' | 'letterSpacing' | 'textUnderline' | 'maximize' | 'colors' | 'colorPicker' | 'droplet' | 'disability' | 'wheelchair' | 'brain' | 'flash' | 'touch';
167
288
  declare const DGA_ICON_SVG: Record<DgaIconName, string>;
168
- /** Sorted list of curated chrome icon names (for docs / pickers). */
169
289
  declare const DGA_ICON_NAMES: DgaIconName[];
170
- /** Names that mirror with reading direction (use for next/back affordances). */
171
290
  declare const DGA_LOGICAL_ICON_NAMES: Set<DgaIconName>;
172
291
 
173
292
  /**
@@ -239,6 +358,7 @@ declare class DgaIconBadge {
239
358
  type DgaFormStatus = 'default' | 'error' | 'success' | 'warning' | 'info';
240
359
  /** Shared size scale — sm≈32px, md≈40px, lg=48px. */
241
360
  type DgaFormControlSize = 'sm' | 'md' | 'lg';
361
+ declare function dgaFormStatusFromInvalid(invalid: boolean): DgaFormStatus;
242
362
 
243
363
  type DgaInputSize = DgaFormControlSize;
244
364
 
@@ -364,6 +484,8 @@ interface DgaSelectOption {
364
484
  label: string;
365
485
  value: string;
366
486
  disabled?: boolean;
487
+ /** Extra text matched when `searchable` (e.g. country name). */
488
+ keywords?: string;
367
489
  }
368
490
  type DgaSelectOpenMode = 'dropdown' | 'always';
369
491
  type DgaSelectSize = DgaFormControlSize;
@@ -518,6 +640,10 @@ declare class DgaSlider {
518
640
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaSlider, "input[type=\"range\"][dgaSlider]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
519
641
  }
520
642
 
643
+ /**
644
+ * Multi-cell one-time password input.
645
+ * The control group is always LTR so digits read and fill left-to-right on RTL pages.
646
+ */
521
647
  declare class DgaOtp implements ControlValueAccessor {
522
648
  private cells;
523
649
  readonly length: _angular_core.InputSignal<number>;
@@ -539,6 +665,9 @@ declare class DgaOtp implements ControlValueAccessor {
539
665
  onInput(index: number, raw: string): void;
540
666
  onKey(index: number, event: KeyboardEvent): void;
541
667
  onPaste(event: ClipboardEvent): void;
668
+ private focusAt;
669
+ /** Keep native inputs in sync when autofill bypasses `maxlength`. */
670
+ private syncDom;
542
671
  private commit;
543
672
  writeValue(value: string): void;
544
673
  registerOnChange(fn: (value: string) => void): void;
@@ -634,13 +763,13 @@ interface DgaPhoneCountry {
634
763
  code: string;
635
764
  /** Short label shown in the prefix select. */
636
765
  label: string;
637
- /** Optional longer name for option text. */
766
+ /** Optional longer name for option text / search. */
638
767
  name?: string;
639
768
  }
640
769
  /** GCC-first dial codes for contact forms. */
641
770
  declare const DGA_PHONE_COUNTRIES: DgaPhoneCountry[];
642
771
  /**
643
- * Phone field with country-code prefix select.
772
+ * Phone field with searchable country-code prefix select.
644
773
  * The control group is always LTR so digits and codes read correctly in RTL pages.
645
774
  */
646
775
  declare class DgaPhoneInput implements ControlValueAccessor {
@@ -659,10 +788,13 @@ declare class DgaPhoneInput implements ControlValueAccessor {
659
788
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
660
789
  /** Full E.164-ish combined value: country code + national digits. */
661
790
  readonly value: _angular_core.ModelSignal<string>;
791
+ readonly countryOptions: _angular_core.Signal<DgaSelectOption[]>;
792
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
662
793
  readonly groupClasses: _angular_core.Signal<string>;
663
794
  private onChange;
664
795
  onTouched: () => void;
665
796
  constructor();
797
+ onCountryCode(next: string | string[]): void;
666
798
  writeValue(value: string): void;
667
799
  registerOnChange(fn: (value: string) => void): void;
668
800
  registerOnTouched(fn: () => void): void;
@@ -714,208 +846,6 @@ declare class DgaMultiselect {
714
846
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaMultiselect, "dga-multiselect", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "removeLabel": { "alias": "removeLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "dgaInvalid"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
715
847
  }
716
848
 
717
- /** Calendar system for date values and the picker UI. */
718
- type DgaDateCalendar = 'gregorian' | 'hijri';
719
- /** Picker UI mode — inferred from `format` tokens when not set explicitly. */
720
- type DgaDatePickerMode = 'day' | 'month' | 'year';
721
- type DgaDateLocale = 'ar' | 'en';
722
- interface DgaCalendarParts {
723
- year: number;
724
- month: number;
725
- day: number;
726
- }
727
- declare const DGA_HIJRI_MONTHS: {
728
- readonly ar: readonly ["محرم", "صفر", "ربيع الأول", "ربيع الثاني", "جمادى الأولى", "جمادى الآخرة", "رجب", "شعبان", "رمضان", "شوال", "ذو القعدة", "ذو الحجة"];
729
- readonly en: readonly ["Muharram", "Safar", "Rabi I", "Rabi II", "Jumada I", "Jumada II", "Rajab", "Sha'ban", "Ramadan", "Shawwal", "Dhu al-Qi'dah", "Dhu al-Hijjah"];
730
- };
731
- declare const DGA_GREGORIAN_MONTHS: {
732
- readonly ar: readonly ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"];
733
- readonly en: readonly ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
734
- };
735
- declare const DGA_WEEKDAYS: {
736
- readonly ar: readonly ["أحد", "إثن", "ثلا", "أرب", "خمي", "جمع", "سبت"];
737
- readonly en: readonly ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
738
- };
739
- /** Read calendar parts for a Date (UTC day). */
740
- declare function dgaGetCalendarParts(date: Date, calendar: DgaDateCalendar): DgaCalendarParts;
741
- /**
742
- * Convert calendar parts to a Date (UTC midnight).
743
- * Hijri conversion uses binary search against islamic-umalqura.
744
- */
745
- declare function dgaPartsToDate(parts: DgaCalendarParts, calendar: DgaDateCalendar): Date;
746
- declare function dgaDaysInMonth(year: number, month: number, calendar: DgaDateCalendar): number;
747
- declare function dgaAddMonths(parts: DgaCalendarParts, delta: number, calendar: DgaDateCalendar): DgaCalendarParts;
748
- /** Infer mode from format tokens (YYYY / MM / DD). */
749
- declare function dgaModeFromFormat(format: string): DgaDatePickerMode;
750
- declare function dgaFormatDate(date: Date, format: string, calendar: DgaDateCalendar): string;
751
- declare function dgaParseDate(value: string, format: string, calendar: DgaDateCalendar): Date | null;
752
- declare function dgaSameDay(a: Date | null, b: Date | null, calendar?: DgaDateCalendar): boolean;
753
- declare function dgaCompareDays(a: Date | null, b: Date | null, calendar?: DgaDateCalendar): number;
754
- declare function dgaClampDate(date: Date, min?: Date | null, max?: Date | null, calendar?: DgaDateCalendar): Date;
755
- declare function dgaMonthNames(calendar: DgaDateCalendar, locale: 'ar' | 'en'): readonly string[];
756
- /** First weekday (0=Sun) of the given calendar month. */
757
- declare function dgaMonthStartWeekday(year: number, month: number, calendar: DgaDateCalendar): number;
758
- declare function dgaTodayUtc(): Date;
759
- /** Coerce string | Date | null to UTC date using format when string. */
760
- declare function dgaCoerceDate(value: string | Date | null | undefined, format: string, calendar: DgaDateCalendar): Date | null;
761
-
762
- interface DgaDateRangeValue {
763
- start: string;
764
- end: string;
765
- }
766
- type PanelView = DgaDatePickerMode;
767
- declare class DgaDatePickerComponent implements ControlValueAccessor {
768
- private readonly host;
769
- private readonly destroyRef;
770
- readonly inputId: string;
771
- readonly panelId: string;
772
- readonly valueInput: _angular_core.InputSignal<string>;
773
- readonly value: _angular_core.WritableSignal<string>;
774
- readonly startValue: _angular_core.ModelSignal<string>;
775
- readonly endValue: _angular_core.ModelSignal<string>;
776
- private onChange;
777
- private onTouched;
778
- readonly calendar: _angular_core.InputSignal<DgaDateCalendar>;
779
- readonly range: _angular_core.InputSignalWithTransform<boolean, unknown>;
780
- readonly format: _angular_core.InputSignal<string>;
781
- readonly mode: _angular_core.InputSignal<DgaDatePickerMode | null>;
782
- readonly locale: _angular_core.InputSignal<DgaDateLocale>;
783
- readonly minDate: _angular_core.InputSignal<string | Date | null>;
784
- readonly maxDate: _angular_core.InputSignal<string | Date | null>;
785
- readonly yearBefore: _angular_core.InputSignal<number>;
786
- readonly yearAfter: _angular_core.InputSignal<number>;
787
- readonly placeholder: _angular_core.InputSignal<string>;
788
- readonly controlId: _angular_core.InputSignal<string>;
789
- readonly name: _angular_core.InputSignal<string>;
790
- readonly size: _angular_core.InputSignal<DgaFormControlSize>;
791
- readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
792
- private readonly cvaDisabled;
793
- readonly disabled: _angular_core.Signal<boolean>;
794
- readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
795
- readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
796
- readonly editable: _angular_core.InputSignalWithTransform<boolean, unknown>;
797
- readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
798
- readonly status: _angular_core.InputSignal<DgaFormStatus>;
799
- readonly rangeSeparator: _angular_core.InputSignal<string>;
800
- readonly todayLabel: _angular_core.InputSignal<string>;
801
- readonly clearLabel: _angular_core.InputSignal<string>;
802
- readonly closeLabel: _angular_core.InputSignal<string>;
803
- readonly saveLabel: _angular_core.InputSignal<string>;
804
- readonly ariaLabel: _angular_core.InputSignal<string>;
805
- readonly resolvedTodayLabel: _angular_core.Signal<string>;
806
- readonly resolvedClearLabel: _angular_core.Signal<string>;
807
- readonly resolvedCloseLabel: _angular_core.Signal<string>;
808
- readonly resolvedSaveLabel: _angular_core.Signal<string>;
809
- readonly valueChange: _angular_core.OutputEmitterRef<string>;
810
- readonly rangeChange: _angular_core.OutputEmitterRef<DgaDateRangeValue>;
811
- readonly open: _angular_core.WritableSignal<boolean>;
812
- readonly panelStyle: _angular_core.WritableSignal<Record<string, string>>;
813
- readonly panelView: _angular_core.WritableSignal<DgaDatePickerMode>;
814
- readonly viewParts: _angular_core.WritableSignal<DgaCalendarParts>;
815
- readonly draftStart: _angular_core.WritableSignal<Date | null>;
816
- readonly draftEnd: _angular_core.WritableSignal<Date | null>;
817
- readonly rangePickPhase: _angular_core.WritableSignal<"start" | "end">;
818
- readonly typedValue: _angular_core.WritableSignal<string | null>;
819
- readonly effectiveStatus: _angular_core.Signal<DgaFormStatus>;
820
- readonly panelMode: _angular_core.Signal<DgaDatePickerMode>;
821
- readonly labels: _angular_core.Signal<{
822
- readonly today: "اليوم";
823
- readonly clear: "مسح";
824
- readonly close: "إغلاق";
825
- readonly save: "حفظ";
826
- readonly prev: "السابق";
827
- readonly next: "التالي";
828
- readonly calendar: "فتح التقويم";
829
- readonly clearInput: "مسح التاريخ";
830
- readonly month: "الشهر";
831
- readonly year: "السنة";
832
- readonly placeholder: "يوم/شهر/سنة";
833
- readonly rangeStart: "تاريخ البداية";
834
- readonly rangeEnd: "تاريخ النهاية";
835
- } | {
836
- readonly today: "Today";
837
- readonly clear: "Clear";
838
- readonly close: "Close";
839
- readonly save: "Save";
840
- readonly prev: "Previous";
841
- readonly next: "Next";
842
- readonly calendar: "Open calendar";
843
- readonly clearInput: "Clear date";
844
- readonly month: "Month";
845
- readonly year: "Year";
846
- readonly placeholder: "DD/MM/YYYY";
847
- readonly rangeStart: "Start date";
848
- readonly rangeEnd: "End date";
849
- }>;
850
- readonly resolvedPlaceholder: _angular_core.Signal<string>;
851
- readonly weekdays: _angular_core.Signal<readonly ["أحد", "إثن", "ثلا", "أرب", "خمي", "جمع", "سبت"] | readonly ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]>;
852
- readonly minBound: _angular_core.Signal<Date | null>;
853
- readonly maxBound: _angular_core.Signal<Date | null>;
854
- readonly displayValue: _angular_core.Signal<string>;
855
- readonly viewYear: _angular_core.Signal<number>;
856
- readonly viewMonth: _angular_core.Signal<number>;
857
- readonly monthOptions: _angular_core.Signal<{
858
- value: number;
859
- label: string;
860
- selected: boolean;
861
- disabled: boolean;
862
- }[]>;
863
- readonly yearOptions: _angular_core.Signal<{
864
- value: number;
865
- selected: boolean;
866
- disabled: boolean;
867
- }[]>;
868
- readonly dayCells: _angular_core.Signal<DayCell[]>;
869
- constructor();
870
- onDocumentClick(event: MouseEvent): void;
871
- onEscape(): void;
872
- onReposition(): void;
873
- monthLabel(month: number): string;
874
- togglePanel(): void;
875
- openPanel(): void;
876
- closePanel(restoreDraft?: boolean): void;
877
- private repositionPanel;
878
- navigate(delta: number): void;
879
- setPanelView(view: PanelView): void;
880
- selectDay(day: number): void;
881
- selectMonth(month: number): void;
882
- selectYear(year: number): void;
883
- goToday(): void;
884
- clearDraft(): void;
885
- clearAll(): void;
886
- save(): void;
887
- onInput(raw: string): void;
888
- onInputBlur(): void;
889
- onInputKeydown(event: KeyboardEvent): void;
890
- private applyDraftDate;
891
- private draftAnchorParts;
892
- private syncDraftFromModels;
893
- private parseRangeFromValue;
894
- private emitValues;
895
- writeValue(value: string): void;
896
- registerOnChange(fn: (value: string) => void): void;
897
- registerOnTouched(fn: () => void): void;
898
- setDisabledState(isDisabled: boolean): void;
899
- private isDateDisabled;
900
- private isMonthDisabled;
901
- private isYearDisabled;
902
- private initialViewParts;
903
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaDatePickerComponent, never>;
904
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaDatePickerComponent, "dga-date-picker", never, { "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "startValue": { "alias": "startValue"; "required": false; "isSignal": true; }; "endValue": { "alias": "endValue"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "range": { "alias": "range"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "yearBefore": { "alias": "yearBefore"; "required": false; "isSignal": true; }; "yearAfter": { "alias": "yearAfter"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "invalid": { "alias": "dgaInvalid"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "required": false; "isSignal": true; }; "rangeSeparator": { "alias": "rangeSeparator"; "required": false; "isSignal": true; }; "todayLabel": { "alias": "todayLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "saveLabel": { "alias": "saveLabel"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, { "startValue": "startValueChange"; "endValue": "endValueChange"; "valueChange": "valueChange"; "rangeChange": "rangeChange"; }, never, never, true, never>;
905
- }
906
- interface DayCell {
907
- key: string;
908
- empty: boolean;
909
- day?: number;
910
- today?: boolean;
911
- selected?: boolean;
912
- inRange?: boolean;
913
- rangeStart?: boolean;
914
- rangeEnd?: boolean;
915
- disabled?: boolean;
916
- label?: string;
917
- }
918
-
919
849
  type DgaTimePickerSize = DgaNativeSelectSize;
920
850
  type DgaTimePickerFormat = '24h' | '12h';
921
851
  declare function pad2(n: number): string;
@@ -1031,7 +961,22 @@ declare class DgaModal {
1031
961
  }
1032
962
 
1033
963
  type DgaToastVariant = 'neutral' | 'success' | 'info' | 'warning' | 'error';
964
+ /**
965
+ * Enter / exit motion:
966
+ * - `fade` — opacity only
967
+ * - `push` — drop in from the nearest vertical edge (default)
968
+ * - `slide` — slide in from the nearest inline edge
969
+ * - `scale` — fade + slight scale
970
+ * - `none` — instant
971
+ */
972
+ type DgaToastAnimation = 'fade' | 'push' | 'slide' | 'scale' | 'none';
973
+ /**
974
+ * Viewport placement (logical start/end follow `dir`).
975
+ * Default `top-end` matches prior fixed `end` + top chrome offset.
976
+ */
977
+ type DgaToastLocation = 'top-start' | 'top-center' | 'top-end' | 'bottom-start' | 'bottom-center' | 'bottom-end';
1034
978
  declare class DgaToast implements OnDestroy {
979
+ private readonly destroyRef;
1035
980
  readonly open: _angular_core.ModelSignal<boolean>;
1036
981
  readonly variant: _angular_core.InputSignal<DgaToastVariant>;
1037
982
  readonly title: _angular_core.InputSignal<string>;
@@ -1039,29 +984,83 @@ declare class DgaToast implements OnDestroy {
1039
984
  readonly closeLabel: _angular_core.InputSignal<string>;
1040
985
  /** Auto-dismiss after ms; `0` disables. Default 5s per a11y guidance. */
1041
986
  readonly duration: _angular_core.InputSignal<number>;
987
+ /** Circular countdown ring on the dismiss control when `duration > 0`. */
988
+ readonly countdown: _angular_core.InputSignalWithTransform<boolean, unknown>;
989
+ /** Pause auto-dismiss while the pointer is over the toast. */
990
+ readonly pauseOnHover: _angular_core.InputSignalWithTransform<boolean, unknown>;
991
+ /** Pause auto-dismiss while focus is inside the toast. */
992
+ readonly pauseOnFocus: _angular_core.InputSignalWithTransform<boolean, unknown>;
993
+ /** Enter / exit motion. Default `push` (from nearest vertical edge). */
994
+ readonly animation: _angular_core.InputSignal<DgaToastAnimation>;
995
+ /** Viewport corner / edge. Default `top-end`. */
996
+ readonly location: _angular_core.InputSignal<DgaToastLocation>;
1042
997
  readonly closed: _angular_core.OutputEmitterRef<void>;
1043
- private timer;
998
+ /** Keeps the toast mounted while the exit animation plays. */
999
+ readonly rendered: _angular_core.WritableSignal<boolean>;
1000
+ readonly leaving: _angular_core.WritableSignal<boolean>;
1001
+ /** Remaining fraction of duration (1 → 0). */
1002
+ readonly progress: _angular_core.WritableSignal<number>;
1003
+ readonly ringR = 10;
1004
+ readonly ringC: number;
1005
+ private remainingMs;
1006
+ private totalMs;
1007
+ private paused;
1008
+ private hoverPaused;
1009
+ private focusPaused;
1010
+ private rafId;
1011
+ private lastTick;
1012
+ private exitTimer;
1013
+ private readonly reduceMotionFlag;
1044
1014
  readonly classes: _angular_core.Signal<string>;
1015
+ readonly hostClass: _angular_core.Signal<string>;
1016
+ readonly isTop: _angular_core.Signal<boolean>;
1045
1017
  /** Clear sticky announcement / reserved chrome, then a small gap. */
1046
- readonly topOffset: _angular_core.Signal<string>;
1018
+ readonly edgeTop: _angular_core.Signal<"calc(var(--dga-announcement-offset, 0px) + 1rem)" | null>;
1019
+ readonly edgeBottom: _angular_core.Signal<"1rem" | null>;
1047
1020
  readonly iconName: _angular_core.Signal<DgaIconName>;
1048
- readonly iconTone: _angular_core.Signal<"success" | "warning" | "error" | "muted" | "current">;
1021
+ readonly iconTone: _angular_core.Signal<"error" | "success" | "warning" | "muted" | "current">;
1022
+ readonly showCountdown: _angular_core.Signal<boolean>;
1023
+ readonly reduceMotion: _angular_core.WritableSignal<boolean>;
1024
+ readonly ringDashOffset: _angular_core.Signal<number>;
1025
+ private readonly animClass;
1049
1026
  constructor();
1050
1027
  ngOnDestroy(): void;
1051
1028
  dismiss(): void;
1052
- private clearTimer;
1029
+ onAnimationEnd(event: AnimationEvent): void;
1030
+ onPointerEnter(): void;
1031
+ onPointerLeave(): void;
1032
+ onFocusIn(): void;
1033
+ onFocusOut(event: FocusEvent): void;
1034
+ private beginClose;
1035
+ private finishClose;
1036
+ private resetTicker;
1037
+ private syncPaused;
1038
+ private startTicker;
1039
+ private stopTicker;
1040
+ private clearExitTimer;
1053
1041
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaToast, never>;
1054
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaToast, "dga-toast", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*"], true, never>;
1042
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaToast, "dga-toast", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "duration": { "alias": "duration"; "required": false; "isSignal": true; }; "countdown": { "alias": "countdown"; "required": false; "isSignal": true; }; "pauseOnHover": { "alias": "pauseOnHover"; "required": false; "isSignal": true; }; "pauseOnFocus": { "alias": "pauseOnFocus"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "location": { "alias": "location"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*"], true, never>;
1055
1043
  }
1056
1044
 
1057
1045
  interface DgaToastShowOptions {
1058
1046
  title?: string;
1059
1047
  message?: string;
1060
1048
  variant?: DgaToastVariant;
1049
+ /** Auto-dismiss after ms; `0` disables. Default 5000. */
1061
1050
  duration?: number;
1062
1051
  dismissible?: boolean;
1063
- }
1064
- interface DgaToastRequest extends Required<Pick<DgaToastShowOptions, 'title' | 'message' | 'variant' | 'duration' | 'dismissible'>> {
1052
+ /** Circular countdown on the dismiss control. Default true when duration > 0. */
1053
+ countdown?: boolean;
1054
+ /** Pause auto-dismiss while hovered. Default true. */
1055
+ pauseOnHover?: boolean;
1056
+ /** Pause auto-dismiss while focused. Default true. */
1057
+ pauseOnFocus?: boolean;
1058
+ /** Enter / exit motion. Default `push`. */
1059
+ animation?: DgaToastAnimation;
1060
+ /** Viewport placement. Default `top-end`. */
1061
+ location?: DgaToastLocation;
1062
+ }
1063
+ interface DgaToastRequest extends Required<Pick<DgaToastShowOptions, 'title' | 'message' | 'variant' | 'duration' | 'dismissible' | 'countdown' | 'pauseOnHover' | 'pauseOnFocus' | 'animation' | 'location'>> {
1065
1064
  id: number;
1066
1065
  }
1067
1066
  /**
@@ -1229,9 +1228,194 @@ declare class DgaMenu {
1229
1228
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaMenu, "dga-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "leadingIcon": { "alias": "leadingIcon"; "required": false; "isSignal": true; }; "showChevron": { "alias": "showChevron"; "required": false; "isSignal": true; }; "menuMinWidth": { "alias": "menuMinWidth"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "selected": "selected"; "selectedValue": "selectedValue"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1230
1229
  }
1231
1230
 
1231
+ type DgaContextMenuItemType = 'item' | 'checkbox' | 'radio' | 'divider' | 'label';
1232
+ interface DgaContextMenuItem {
1233
+ /** Required for actionable items. */
1234
+ label?: string;
1235
+ value?: string;
1236
+ icon?: DgaIconName;
1237
+ /** Shortcut keys shown trailing — `"⌘K"` or `['Ctrl', 'K']`. */
1238
+ shortcut?: string | readonly string[];
1239
+ danger?: boolean;
1240
+ disabled?: boolean;
1241
+ divider?: boolean;
1242
+ type?: DgaContextMenuItemType;
1243
+ /** Checkbox / radio checked state. */
1244
+ checked?: boolean;
1245
+ /** Nested submenu items. */
1246
+ children?: DgaContextMenuItem[];
1247
+ }
1248
+ /** Marks projected content as the context-menu trigger surface. */
1249
+ declare class DgaContextMenuTrigger {
1250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaContextMenuTrigger, never>;
1251
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaContextMenuTrigger, "[dgaContextMenuTrigger]", never, {}, {}, never, never, true, never>;
1252
+ }
1253
+ /**
1254
+ * Right-click / long-press context menu (shadcn-style).
1255
+ *
1256
+ * @see https://ui.shadcn.com/docs/components/base/context-menu
1257
+ *
1258
+ * @example
1259
+ * ```html
1260
+ * <dga-context-menu [items]="items" (selected)="onSelect($event)">
1261
+ * <div dgaContextMenuTrigger class="rounded-md border p-3xl">
1262
+ * Right click here
1263
+ * </div>
1264
+ * </dga-context-menu>
1265
+ * ```
1266
+ */
1267
+ declare class DgaContextMenu {
1268
+ private readonly host;
1269
+ private readonly injector;
1270
+ private readonly destroyRef;
1271
+ private readonly surfaceRef;
1272
+ private readonly menuRef;
1273
+ readonly items: _angular_core.InputSignal<DgaContextMenuItem[]>;
1274
+ readonly open: _angular_core.ModelSignal<boolean>;
1275
+ /** Enable long-press on touch (default true). */
1276
+ readonly longPress: _angular_core.InputSignalWithTransform<boolean, unknown>;
1277
+ readonly longPressMs: _angular_core.InputSignal<number>;
1278
+ readonly menuMinWidth: _angular_core.InputSignal<string>;
1279
+ readonly selected: _angular_core.OutputEmitterRef<DgaContextMenuItem>;
1280
+ readonly selectedValue: _angular_core.OutputEmitterRef<string>;
1281
+ readonly opened: _angular_core.OutputEmitterRef<void>;
1282
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1283
+ readonly panelStyle: _angular_core.WritableSignal<Record<string, string>>;
1284
+ readonly subStyle: _angular_core.WritableSignal<Record<string, string>>;
1285
+ readonly openSubIndex: _angular_core.WritableSignal<number | null>;
1286
+ readonly isRtl: _angular_core.WritableSignal<boolean>;
1287
+ private readonly seq;
1288
+ readonly listId: string;
1289
+ private activeIndex;
1290
+ private pointer;
1291
+ private longPressTimer;
1292
+ private readonly onReposition;
1293
+ constructor();
1294
+ menuClasses(): string;
1295
+ itemId(index: number): string;
1296
+ trackItem(item: DgaContextMenuItem, index: number): string;
1297
+ shortcutKeys(item: DgaContextMenuItem): string[] | null;
1298
+ itemClass(item: DgaContextMenuItem): string;
1299
+ onContextMenu(event: MouseEvent): void;
1300
+ onTouchStart(event: TouchEvent): void;
1301
+ onTouchEnd(): void;
1302
+ onItemClick(item: DgaContextMenuItem, event: MouseEvent): void;
1303
+ onItemEnter(item: DgaContextMenuItem, index: number, event: PointerEvent): void;
1304
+ selectItem(item: DgaContextMenuItem): void;
1305
+ close(restoreFocus?: boolean): void;
1306
+ onMenuKey(event: KeyboardEvent): void;
1307
+ onDocumentPointer(event: PointerEvent): void;
1308
+ onDocumentKeydown(event: KeyboardEvent): void;
1309
+ private openAtPointer;
1310
+ private clearLongPress;
1311
+ private isSelectable;
1312
+ private firstSelectableIndex;
1313
+ private stepIndex;
1314
+ private portalMenuToBody;
1315
+ private detachPortaledMenu;
1316
+ private syncPanelPosition;
1317
+ private syncSubPosition;
1318
+ private focusItem;
1319
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaContextMenu, never>;
1320
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaContextMenu, "dga-context-menu", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "longPress": { "alias": "longPress"; "required": false; "isSignal": true; }; "longPressMs": { "alias": "longPressMs"; "required": false; "isSignal": true; }; "menuMinWidth": { "alias": "menuMinWidth"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "selected": "selected"; "selectedValue": "selectedValue"; "opened": "opened"; "closed": "closed"; }, never, ["*"], true, never>;
1321
+ }
1322
+
1323
+ interface DgaCommandItem {
1324
+ /** Stable id used for tracking / selection. */
1325
+ id: string;
1326
+ label: string;
1327
+ value?: string;
1328
+ icon?: DgaIconName;
1329
+ /** Shortcut keys — `"⌘P"` or `['Ctrl', 'P']`. */
1330
+ shortcut?: string | readonly string[];
1331
+ disabled?: boolean;
1332
+ /** Extra search tokens (labels are always searchable). */
1333
+ keywords?: readonly string[];
1334
+ }
1335
+ interface DgaCommandGroup {
1336
+ heading?: string;
1337
+ items: DgaCommandItem[];
1338
+ }
1339
+ type DgaCommandAppearance = 'panel' | 'dialog';
1340
+ /**
1341
+ * Command palette — searchable actions (cmdk / shadcn-style).
1342
+ *
1343
+ * Use `appearance="dialog"` for a centered modal palette, or `panel` for inline.
1344
+ *
1345
+ * @see https://ui.shadcn.com/docs/components/base/command
1346
+ *
1347
+ * @example
1348
+ * ```html
1349
+ * <dga-command
1350
+ * [(open)]="cmdOpen"
1351
+ * appearance="dialog"
1352
+ * [groups]="commandGroups"
1353
+ * (selected)="run($event)"
1354
+ * />
1355
+ * ```
1356
+ */
1357
+ declare class DgaCommand {
1358
+ private readonly destroyRef;
1359
+ private readonly injector;
1360
+ private readonly queryInput;
1361
+ readonly groups: _angular_core.InputSignal<DgaCommandGroup[]>;
1362
+ /** Flat items when you do not need group headings. */
1363
+ readonly items: _angular_core.InputSignal<DgaCommandItem[]>;
1364
+ readonly open: _angular_core.ModelSignal<boolean>;
1365
+ readonly appearance: _angular_core.InputSignal<DgaCommandAppearance>;
1366
+ readonly placeholder: _angular_core.InputSignal<string>;
1367
+ readonly emptyLabel: _angular_core.InputSignal<string>;
1368
+ readonly clearLabel: _angular_core.InputSignal<string>;
1369
+ readonly dialogLabel: _angular_core.InputSignal<string>;
1370
+ readonly listLabel: _angular_core.InputSignal<string>;
1371
+ readonly closeOnSelect: _angular_core.InputSignalWithTransform<boolean, unknown>;
1372
+ readonly closeOnBackdrop: _angular_core.InputSignalWithTransform<boolean, unknown>;
1373
+ /** Optional global shortcut to toggle (Ctrl/⌘+K). Dialog mode only. */
1374
+ readonly hotkey: _angular_core.InputSignalWithTransform<boolean, unknown>;
1375
+ readonly selected: _angular_core.OutputEmitterRef<DgaCommandItem>;
1376
+ readonly selectedValue: _angular_core.OutputEmitterRef<string>;
1377
+ readonly opened: _angular_core.OutputEmitterRef<void>;
1378
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1379
+ readonly queryChange: _angular_core.OutputEmitterRef<string>;
1380
+ readonly query: _angular_core.WritableSignal<string>;
1381
+ readonly activeId: _angular_core.WritableSignal<string | null>;
1382
+ private readonly seq;
1383
+ readonly listId: string;
1384
+ private previousFocus;
1385
+ private wasOpen;
1386
+ /** Panel is always shown; dialog only when `open`. */
1387
+ readonly show: _angular_core.Signal<boolean>;
1388
+ readonly filteredGroups: _angular_core.Signal<DgaCommandGroup[]>;
1389
+ readonly flatFiltered: _angular_core.Signal<DgaCommandItem[]>;
1390
+ readonly activeDescendant: _angular_core.Signal<string | null>;
1391
+ constructor();
1392
+ optionId(id: string): string;
1393
+ shortcutKeys(item: DgaCommandItem): string[] | null;
1394
+ onQueryInput(event: Event): void;
1395
+ clearQuery(): void;
1396
+ setActive(id: string): void;
1397
+ select(item: DgaCommandItem): void;
1398
+ close(): void;
1399
+ onBackdrop(): void;
1400
+ onRootKey(event: KeyboardEvent): void;
1401
+ onInputKey(event: KeyboardEvent): void;
1402
+ onHotkey(event: KeyboardEvent): void;
1403
+ private moveActive;
1404
+ private resolveGroups;
1405
+ private matches;
1406
+ private normalize;
1407
+ private focusInput;
1408
+ private restoreFocus;
1409
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCommand, never>;
1410
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCommand, "dga-command", never, { "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "dialogLabel": { "alias": "dialogLabel"; "required": false; "isSignal": true; }; "listLabel": { "alias": "listLabel"; "required": false; "isSignal": true; }; "closeOnSelect": { "alias": "closeOnSelect"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "hotkey": { "alias": "hotkey"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "selected": "selected"; "selectedValue": "selectedValue"; "opened": "opened"; "closed": "closed"; "queryChange": "queryChange"; }, never, never, true, never>;
1411
+ }
1412
+
1232
1413
  type DgaDrawerSide = 'start' | 'end';
1233
1414
  declare class DgaDrawer {
1415
+ private readonly doc;
1416
+ private readonly destroyRef;
1234
1417
  private readonly injector;
1418
+ private readonly rootRef;
1235
1419
  private readonly panel;
1236
1420
  readonly open: _angular_core.ModelSignal<boolean>;
1237
1421
  readonly title: _angular_core.InputSignal<string>;
@@ -1242,12 +1426,16 @@ declare class DgaDrawer {
1242
1426
  readonly closed: _angular_core.OutputEmitterRef<void>;
1243
1427
  readonly titleId: string;
1244
1428
  private previousFocus;
1245
- private previousOverflow;
1429
+ private previousBodyOverflow;
1430
+ private previousHtmlOverflow;
1431
+ private scrollLocked;
1246
1432
  readonly panelClasses: _angular_core.Signal<string>;
1247
1433
  constructor();
1248
1434
  close(): void;
1249
1435
  onBackdrop(): void;
1250
1436
  onKeydown(event: KeyboardEvent): void;
1437
+ private portalToBody;
1438
+ private removePortaledRoot;
1251
1439
  private focusInitial;
1252
1440
  private trapFocus;
1253
1441
  private getFocusable;
@@ -1323,6 +1511,114 @@ declare class DgaImagePopup {
1323
1511
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaImagePopup, "dga-image-popup", never, { "images": { "alias": "images"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "imageTransition": { "alias": "imageTransition"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "activeIndex": "activeIndexChange"; "closed": "closed"; "opened": "opened"; }, never, never, true, never>;
1324
1512
  }
1325
1513
 
1514
+ /** Logical placements (RTL-aware via inset-inline). */
1515
+ type DgaTourPlacement = 'top' | 'bottom' | 'start' | 'end' | 'auto';
1516
+ type DgaTourPersist = 'local' | 'session' | 'none';
1517
+ interface DgaTourStep {
1518
+ /** Optional stable id for analytics. */
1519
+ id?: string;
1520
+ /**
1521
+ * CSS selector for the highlighted element.
1522
+ * Omit or leave empty for a centered intro / outro card.
1523
+ */
1524
+ target?: string;
1525
+ title: string;
1526
+ description: string;
1527
+ placement?: DgaTourPlacement;
1528
+ /** Scroll the target into view before measuring (default true). */
1529
+ scroll?: boolean;
1530
+ /** Extra padding around the spotlight hole (px). */
1531
+ padding?: number;
1532
+ }
1533
+ interface SpotRect {
1534
+ top: number;
1535
+ left: number;
1536
+ width: number;
1537
+ height: number;
1538
+ }
1539
+ interface PopoverPos {
1540
+ top: number;
1541
+ left: number;
1542
+ placement: Exclude<DgaTourPlacement, 'auto'>;
1543
+ }
1544
+ /**
1545
+ * Multi-step onboarding tour with spotlight + coachmark.
1546
+ *
1547
+ * Targets elements via CSS selectors (e.g. `[data-dga-action="login"]`).
1548
+ * Empty `target` steps render a centered welcome / finish card.
1549
+ *
1550
+ * @example
1551
+ * ```html
1552
+ * <dga-tour
1553
+ * [(open)]="tourOpen"
1554
+ * [steps]="tourSteps"
1555
+ * persist="local"
1556
+ * persistKey="portal-onboarding"
1557
+ * />
1558
+ * ```
1559
+ */
1560
+ declare class DgaTour {
1561
+ private readonly doc;
1562
+ private readonly destroyRef;
1563
+ private readonly injector;
1564
+ private readonly rootRef;
1565
+ readonly open: _angular_core.ModelSignal<boolean>;
1566
+ readonly steps: _angular_core.InputSignal<DgaTourStep[]>;
1567
+ readonly stepIndex: _angular_core.ModelSignal<number>;
1568
+ readonly nextLabel: _angular_core.InputSignal<string>;
1569
+ readonly prevLabel: _angular_core.InputSignal<string>;
1570
+ readonly skipLabel: _angular_core.InputSignal<string>;
1571
+ readonly doneLabel: _angular_core.InputSignal<string>;
1572
+ /** Template: `{current}` and `{total}` */
1573
+ readonly stepOfLabel: _angular_core.InputSignal<string>;
1574
+ readonly allowSkip: _angular_core.InputSignalWithTransform<boolean, unknown>;
1575
+ readonly closeOnBackdrop: _angular_core.InputSignalWithTransform<boolean, unknown>;
1576
+ /** Auto-open on first visit when persist storage has no flag. */
1577
+ readonly autoStart: _angular_core.InputSignalWithTransform<boolean, unknown>;
1578
+ readonly persist: _angular_core.InputSignal<DgaTourPersist>;
1579
+ readonly persistKey: _angular_core.InputSignal<string>;
1580
+ readonly completed: _angular_core.OutputEmitterRef<void>;
1581
+ readonly skipped: _angular_core.OutputEmitterRef<void>;
1582
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1583
+ readonly stepChange: _angular_core.OutputEmitterRef<number>;
1584
+ readonly titleId: string;
1585
+ readonly spot: _angular_core.WritableSignal<SpotRect | null>;
1586
+ readonly popover: _angular_core.WritableSignal<PopoverPos | null>;
1587
+ private previousFocus;
1588
+ private resizeObserver;
1589
+ private measureRaf;
1590
+ private unbindViewport;
1591
+ private autoStarted;
1592
+ readonly visible: _angular_core.Signal<boolean>;
1593
+ readonly current: _angular_core.Signal<DgaTourStep>;
1594
+ readonly isLast: _angular_core.Signal<boolean>;
1595
+ readonly progressLabel: _angular_core.Signal<string>;
1596
+ constructor();
1597
+ next(): void;
1598
+ prev(): void;
1599
+ skip(): void;
1600
+ onBackdrop(): void;
1601
+ onKeydown(event: KeyboardEvent): void;
1602
+ private goTo;
1603
+ private finish;
1604
+ private scheduleMeasure;
1605
+ private measure;
1606
+ private placePopover;
1607
+ private bindObservers;
1608
+ /** Move layer to `document.body` so sticky announcement / headers cannot sit above it. */
1609
+ private portalToBody;
1610
+ private removePortaledRoot;
1611
+ private teardownObservers;
1612
+ private focusCard;
1613
+ private restoreFocus;
1614
+ private clampIndex;
1615
+ private storage;
1616
+ private hasSeen;
1617
+ private markSeen;
1618
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTour, never>;
1619
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTour, "dga-tour", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "stepIndex": { "alias": "stepIndex"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "skipLabel": { "alias": "skipLabel"; "required": false; "isSignal": true; }; "doneLabel": { "alias": "doneLabel"; "required": false; "isSignal": true; }; "stepOfLabel": { "alias": "stepOfLabel"; "required": false; "isSignal": true; }; "allowSkip": { "alias": "allowSkip"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; "autoStart": { "alias": "autoStart"; "required": false; "isSignal": true; }; "persist": { "alias": "persist"; "required": false; "isSignal": true; }; "persistKey": { "alias": "persistKey"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "stepIndex": "stepIndexChange"; "completed": "completed"; "skipped": "skipped"; "closed": "closed"; "stepChange": "stepChange"; }, never, never, true, never>;
1620
+ }
1621
+
1326
1622
  type DgaAlertVariant = 'neutral' | 'critical' | 'error' | 'warning' | 'info' | 'success';
1327
1623
  /** Layout: default card alert, or compact single-line banner. */
1328
1624
  type DgaAlertDisplay = 'default' | 'inline';
@@ -1344,7 +1640,7 @@ declare class DgaAlert {
1344
1640
  readonly titleClasses: _angular_core.Signal<string>;
1345
1641
  readonly descriptionClasses: _angular_core.Signal<string>;
1346
1642
  readonly iconName: _angular_core.Signal<DgaIconName>;
1347
- readonly iconTone: _angular_core.Signal<"success" | "warning" | "error" | "muted" | "current">;
1643
+ readonly iconTone: _angular_core.Signal<"error" | "success" | "warning" | "muted" | "current">;
1348
1644
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAlert, never>;
1349
1645
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAlert, "dga-alert", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "dismissed": "dismissed"; }, never, ["*", "[dgaAlertActions]"], true, never>;
1350
1646
  }
@@ -1458,204 +1754,11 @@ declare class DgaPageFeedback {
1458
1754
  onSubmit(event: Event): void;
1459
1755
  /** From details → idle; from thanks → dismiss the panel. */
1460
1756
  close(): void;
1757
+ safeHref(href: string | undefined | null): string;
1461
1758
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPageFeedback, never>;
1462
1759
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPageFeedback, "dga-page-feedback", never, { "question": { "alias": "question"; "required": false; "isSignal": true; }; "yesLabel": { "alias": "yesLabel"; "required": false; "isSignal": true; }; "noLabel": { "alias": "noLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "whyLabel": { "alias": "whyLabel"; "required": false; "isSignal": true; }; "whyHint": { "alias": "whyHint"; "required": false; "isSignal": true; }; "genderLabel": { "alias": "genderLabel"; "required": false; "isSignal": true; }; "commentLabel": { "alias": "commentLabel"; "required": false; "isSignal": true; }; "commentPlaceholder": { "alias": "commentPlaceholder"; "required": false; "isSignal": true; }; "submitLabel": { "alias": "submitLabel"; "required": false; "isSignal": true; }; "statistic": { "alias": "statistic"; "required": false; "isSignal": true; }; "thankYouMessage": { "alias": "thankYouMessage"; "required": false; "isSignal": true; }; "agreementBefore": { "alias": "agreementBefore"; "required": false; "isSignal": true; }; "participationLabel": { "alias": "participationLabel"; "required": false; "isSignal": true; }; "participationHref": { "alias": "participationHref"; "required": false; "isSignal": true; }; "agreementAnd": { "alias": "agreementAnd"; "required": false; "isSignal": true; }; "rulesLabel": { "alias": "rulesLabel"; "required": false; "isSignal": true; }; "rulesHref": { "alias": "rulesHref"; "required": false; "isSignal": true; }; "agreementAfter": { "alias": "agreementAfter"; "required": false; "isSignal": true; }; "defaultAgreement": { "alias": "defaultAgreement"; "required": false; "isSignal": true; }; "yesReasons": { "alias": "yesReasons"; "required": false; "isSignal": true; }; "noReasons": { "alias": "noReasons"; "required": false; "isSignal": true; }; "genderOptions": { "alias": "genderOptions"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; }, { "submitted": "submitted"; "closed": "closed"; }, never, ["[dgaPageFeedbackAgreement]"], true, never>;
1463
1760
  }
1464
1761
 
1465
- /** Stored consent outcome. `custom` = per-category preferences were saved. */
1466
- type DgaCookieConsent = 'accepted' | 'declined' | 'custom' | null;
1467
- /** Horizontal placement. Logical `start`/`end` follow reading direction. */
1468
- type DgaCookiesAlign = 'start' | 'center' | 'end';
1469
- /**
1470
- * Banner anchor on the viewport.
1471
- * - `start` | `center` | `end` → bottom edge + that alignment (compact)
1472
- * - `bottom` | `top` → that edge, centered
1473
- * - `bottom-start` / `top-end` / … → explicit edge + alignment
1474
- */
1475
- type DgaCookiesPosition = DgaCookiesAlign | 'bottom' | 'top' | 'bottom-start' | 'bottom-center' | 'bottom-end' | 'top-start' | 'top-center' | 'top-end';
1476
- /** Optional cookie category for granular consent (GDPR-style preferences). */
1477
- interface DgaCookieCategory {
1478
- id: string;
1479
- label: string;
1480
- description?: string;
1481
- /** Always enabled; toggle is disabled. */
1482
- required?: boolean;
1483
- /** Initial state when no stored preference exists (ignored when `required`). */
1484
- defaultEnabled?: boolean;
1485
- }
1486
- type DgaCookiePreferences = Record<string, boolean>;
1487
- interface DgaCookieDecision {
1488
- consent: Exclude<DgaCookieConsent, null>;
1489
- preferences: DgaCookiePreferences;
1490
- }
1491
- /**
1492
- * Privacy-compliant cookie consent banner.
1493
- * Persists choice (default 365 days); optional category preferences and GA gating.
1494
- */
1495
- declare class DgaCookies implements OnInit {
1496
- private readonly destroyRef;
1497
- private readonly hostRef;
1498
- /** Original parent before body portal (restored on destroy). */
1499
- private portalHome;
1500
- readonly compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
1501
- /**
1502
- * Viewport anchor. Use `start` / `center` / `end` for bottom placement,
1503
- * or compound values like `top-end`. Prefer `align` to set horizontal only.
1504
- */
1505
- readonly position: _angular_core.InputSignal<DgaCookiesPosition>;
1506
- /** Horizontal alignment (`start` | `center` | `end`). Overrides `position` when set. */
1507
- readonly align: _angular_core.InputSignal<"" | DgaCookiesAlign>;
1508
- /** Auto-open delay when no consent is stored. `0` disables auto-show. */
1509
- readonly delayMs: _angular_core.InputSignal<number>;
1510
- /** When false, never auto-opens (call `show()` manually). */
1511
- readonly autoShow: _angular_core.InputSignalWithTransform<boolean, unknown>;
1512
- /** Show the dismiss (X) control. Dismiss does not persist a decision. */
1513
- readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
1514
- /** Show the reject / decline non-essential button. */
1515
- readonly showDecline: _angular_core.InputSignalWithTransform<boolean, unknown>;
1516
- /** Show policy / terms links row. */
1517
- readonly showLinks: _angular_core.InputSignalWithTransform<boolean, unknown>;
1518
- /** Show Customize when `categories` are provided. */
1519
- readonly showCustomize: _angular_core.InputSignalWithTransform<boolean, unknown>;
1520
- /** Dim the page behind the banner (modal-style overlay). */
1521
- readonly overlay: _angular_core.InputSignalWithTransform<boolean, unknown>;
1522
- /**
1523
- * @deprecated Prefer `overlay`. Same behavior — kept for backward compatibility.
1524
- */
1525
- readonly blocking: _angular_core.InputSignalWithTransform<boolean, unknown>;
1526
- /** Close the banner when the overlay backdrop is clicked (requires dismissible). */
1527
- readonly overlayClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
1528
- readonly termsHref: _angular_core.InputSignal<string>;
1529
- readonly privacyHref: _angular_core.InputSignal<string>;
1530
- /** Optional third policy link (cookie policy). Empty hides it. */
1531
- readonly cookiePolicyHref: _angular_core.InputSignal<string>;
1532
- readonly termsLabel: _angular_core.InputSignal<string>;
1533
- readonly privacyLabel: _angular_core.InputSignal<string>;
1534
- readonly cookiePolicyLabel: _angular_core.InputSignal<string>;
1535
- readonly title: _angular_core.InputSignal<string>;
1536
- readonly description: _angular_core.InputSignal<string>;
1537
- readonly acceptLabel: _angular_core.InputSignal<string>;
1538
- readonly declineLabel: _angular_core.InputSignal<string>;
1539
- readonly customizeLabel: _angular_core.InputSignal<string>;
1540
- readonly saveLabel: _angular_core.InputSignal<string>;
1541
- readonly icon: _angular_core.InputSignal<DgaIconName>;
1542
- /** Google Analytics IDs to disable on decline / when analytics is off. */
1543
- readonly gaTrackingIds: _angular_core.InputSignal<string | readonly string[]>;
1544
- /** Consent cookie lifetime in days. */
1545
- readonly consentDays: _angular_core.InputSignal<number>;
1546
- /** Consent cookie name (also used as localStorage key prefix). */
1547
- readonly consentCookieName: _angular_core.InputSignal<string>;
1548
- /** Extra cookies to delete when analytics/marketing is denied. */
1549
- readonly analyticsCookieNames: _angular_core.InputSignal<readonly string[]>;
1550
- /** Granular categories. When set, Customize / Save Preferences become available. */
1551
- readonly categories: _angular_core.InputSignal<readonly DgaCookieCategory[]>;
1552
- readonly accepted: _angular_core.OutputEmitterRef<void>;
1553
- readonly declined: _angular_core.OutputEmitterRef<void>;
1554
- readonly closed: _angular_core.OutputEmitterRef<void>;
1555
- readonly decided: _angular_core.OutputEmitterRef<"accepted" | "declined" | "custom">;
1556
- readonly preferencesChange: _angular_core.OutputEmitterRef<DgaCookiePreferences>;
1557
- readonly decision: _angular_core.OutputEmitterRef<DgaCookieDecision>;
1558
- /** Controls enter/exit animation state. */
1559
- readonly visible: _angular_core.WritableSignal<boolean>;
1560
- /** Keeps the panel in the DOM while exit animation plays. */
1561
- readonly mounted: _angular_core.WritableSignal<boolean>;
1562
- /** Whether the category preferences panel is expanded. */
1563
- readonly customizing: _angular_core.WritableSignal<boolean>;
1564
- /** Draft toggles while customizing. */
1565
- readonly draftPrefs: _angular_core.WritableSignal<DgaCookiePreferences>;
1566
- private readonly seq;
1567
- readonly titleId: string;
1568
- readonly bodyId: string;
1569
- private openTimer;
1570
- private closeTimer;
1571
- readonly copy: _angular_core.Signal<{
1572
- title: string;
1573
- body: string;
1574
- terms: string;
1575
- privacy: string;
1576
- cookiePolicy: string;
1577
- accept: string;
1578
- acceptAll: string;
1579
- decline: string;
1580
- customize: string;
1581
- save: string;
1582
- categories: string;
1583
- policies: string;
1584
- close: string;
1585
- }>;
1586
- readonly resolvedCategories: _angular_core.Signal<DgaCookieCategory[]>;
1587
- readonly resolvedLinks: _angular_core.Signal<{
1588
- href: string;
1589
- label: string;
1590
- }[]>;
1591
- /**
1592
- * Accept + Decline share a row; Customize / Save spans full width underneath
1593
- * so Arabic labels stay on one line. Actions stay pinned below the scroll body.
1594
- */
1595
- readonly actionsClasses: _angular_core.Signal<string>;
1596
- /** Resolved vertical edge + horizontal align (logical start/end). */
1597
- readonly placement: _angular_core.Signal<{
1598
- edge: "top" | "bottom";
1599
- align: DgaCookiesAlign;
1600
- }>;
1601
- /** Whether a dimmed backdrop is shown (`overlay` or legacy `blocking`). */
1602
- readonly hasOverlay: _angular_core.Signal<boolean>;
1603
- readonly panelClasses: _angular_core.Signal<string>;
1604
- constructor();
1605
- ngOnInit(): void;
1606
- hasCategories(): boolean;
1607
- hasLinks(): boolean;
1608
- /**
1609
- * Re-open the banner (e.g. from a footer Cookie Settings link).
1610
- * Portals to `document.body` so overflow/transform ancestors cannot clip it.
1611
- */
1612
- show(): void;
1613
- /** Hide without persisting a decision. */
1614
- dismiss(): void;
1615
- /** Backdrop click — dismiss only when overlayClose + dismissible. */
1616
- onOverlayClick(): void;
1617
- openCustomize(): void;
1618
- onCategoryToggle(id: string, enabled: boolean): void;
1619
- accept(): void;
1620
- decline(): void;
1621
- savePreferences(): void;
1622
- private commit;
1623
- private buildDefaultPrefs;
1624
- private buildAllPrefs;
1625
- private readStored;
1626
- private hidePanel;
1627
- private trackingIds;
1628
- /** Move host to `body` so fixed positioning escapes overflow/transform ancestors. */
1629
- private ensureBodyPortal;
1630
- private restorePortal;
1631
- private clearTimer;
1632
- private clearCloseTimer;
1633
- static getConsent(cookieName?: string): DgaCookieConsent;
1634
- static getPreferences(cookieName?: string): DgaCookiePreferences | null;
1635
- static setConsent(value: Exclude<DgaCookieConsent, null>, options?: {
1636
- name?: string;
1637
- days?: number;
1638
- preferences?: DgaCookiePreferences;
1639
- }): void;
1640
- static clearConsent(cookieName?: string): void;
1641
- /** @internal */
1642
- static parseStored(raw: string | null): {
1643
- consent: DgaCookieConsent;
1644
- preferences: DgaCookiePreferences | null;
1645
- };
1646
- /** @internal */
1647
- static writeConsent(status: Exclude<DgaCookieConsent, null>, preferences: DgaCookiePreferences | null, opts: {
1648
- name: string;
1649
- days: number;
1650
- hasCategories: boolean;
1651
- }): void;
1652
- static get(name: string): string | null;
1653
- static set(name: string, value: string, days?: number): void;
1654
- static delete(name: string): void;
1655
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCookies, never>;
1656
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCookies, "dga-cookies", never, { "compact": { "alias": "compact"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "delayMs": { "alias": "delayMs"; "required": false; "isSignal": true; }; "autoShow": { "alias": "autoShow"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "showDecline": { "alias": "showDecline"; "required": false; "isSignal": true; }; "showLinks": { "alias": "showLinks"; "required": false; "isSignal": true; }; "showCustomize": { "alias": "showCustomize"; "required": false; "isSignal": true; }; "overlay": { "alias": "overlay"; "required": false; "isSignal": true; }; "blocking": { "alias": "blocking"; "required": false; "isSignal": true; }; "overlayClose": { "alias": "overlayClose"; "required": false; "isSignal": true; }; "termsHref": { "alias": "termsHref"; "required": false; "isSignal": true; }; "privacyHref": { "alias": "privacyHref"; "required": false; "isSignal": true; }; "cookiePolicyHref": { "alias": "cookiePolicyHref"; "required": false; "isSignal": true; }; "termsLabel": { "alias": "termsLabel"; "required": false; "isSignal": true; }; "privacyLabel": { "alias": "privacyLabel"; "required": false; "isSignal": true; }; "cookiePolicyLabel": { "alias": "cookiePolicyLabel"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "acceptLabel": { "alias": "acceptLabel"; "required": false; "isSignal": true; }; "declineLabel": { "alias": "declineLabel"; "required": false; "isSignal": true; }; "customizeLabel": { "alias": "customizeLabel"; "required": false; "isSignal": true; }; "saveLabel": { "alias": "saveLabel"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "gaTrackingIds": { "alias": "gaTrackingIds"; "required": false; "isSignal": true; }; "consentDays": { "alias": "consentDays"; "required": false; "isSignal": true; }; "consentCookieName": { "alias": "consentCookieName"; "required": false; "isSignal": true; }; "analyticsCookieNames": { "alias": "analyticsCookieNames"; "required": false; "isSignal": true; }; "categories": { "alias": "categories"; "required": false; "isSignal": true; }; }, { "accepted": "accepted"; "declined": "declined"; "closed": "closed"; "decided": "decided"; "preferencesChange": "preferencesChange"; "decision": "decision"; }, never, never, true, never>;
1657
- }
1658
-
1659
1762
  type DgaRatingSize = 'sm' | 'md' | 'lg';
1660
1763
  declare class DgaRating {
1661
1764
  readonly value: _angular_core.ModelSignal<number>;
@@ -1852,243 +1955,6 @@ declare class DgaChatbot {
1852
1955
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaChatbot, "dga-chatbot", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "fabLabel": { "alias": "fabLabel"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "fabIcon": { "alias": "fabIcon"; "required": false; "isSignal": true; }; "sendIcon": { "alias": "sendIcon"; "required": false; "isSignal": true; }; "agentIcon": { "alias": "agentIcon"; "required": false; "isSignal": true; }; "fabTone": { "alias": "fabTone"; "required": false; "isSignal": true; }; "overlay": { "alias": "overlay"; "required": false; "isSignal": true; }; "overlayClose": { "alias": "overlayClose"; "required": false; "isSignal": true; }; "online": { "alias": "online"; "required": false; "isSignal": true; }; "hideFabWhenOpen": { "alias": "hideFabWhenOpen"; "required": false; "isSignal": true; }; "stack": { "alias": "stack"; "required": false; "isSignal": true; }; "clearFab": { "alias": "clearFab"; "required": false; "isSignal": true; }; "embedded": { "alias": "embedded"; "required": false; "isSignal": true; }; "initialMessages": { "alias": "initialMessages"; "required": false; "isSignal": true; }; }, { "sent": "sent"; "opened": "opened"; "closed": "closed"; }, never, never, true, never>;
1853
1956
  }
1854
1957
 
1855
- /** One-tap accessibility presets (compose primitives + settings). */
1856
- type DgaA11yBundle = 'epilepsy-safe' | 'visually-impaired' | 'cognitive-disability' | 'motor-impaired' | 'colorblind' | 'dyslexia-friendly' | 'adhd-friendly';
1857
- /** Primitive toggles stamped on `data-a11y`. */
1858
- type DgaA11yMode = 'reduce-motion' | 'highlight-links' | 'highlight-titles' | 'high-contrast' | 'dyslexia' | 'reading-mask' | 'motor-targets' | DgaA11yBundle;
1859
- type DgaA11yVisualFilter = 'none' | 'boost-contrast' | 'monochrome' | 'high-contrast' | 'high-saturation' | 'low-saturation' | 'deuteranopia';
1860
- type DgaA11yTextAlign = 'default' | 'start' | 'end' | 'justify';
1861
- type DgaA11yLineHeight = 'normal' | '1.6' | '1.8' | '2.0';
1862
- type DgaA11yLetterSpacing = '0' | '0.04em' | '0.08em' | '0.12em';
1863
- type DgaA11yWordSpacing = '0' | '0.16em' | '0.32em' | '0.48em';
1864
- declare class DgaAccessibilityService {
1865
- private readonly doc;
1866
- private readonly zone;
1867
- private liveRegion;
1868
- private opener;
1869
- private mqMotion;
1870
- private mqContrast;
1871
- readonly isOpen: _angular_core.WritableSignal<boolean>;
1872
- readonly modes: _angular_core.WritableSignal<Set<DgaA11yMode>>;
1873
- readonly visualFilter: _angular_core.WritableSignal<DgaA11yVisualFilter>;
1874
- readonly fontStep: _angular_core.WritableSignal<number>;
1875
- readonly textAlign: _angular_core.WritableSignal<DgaA11yTextAlign>;
1876
- readonly lineHeight: _angular_core.WritableSignal<DgaA11yLineHeight>;
1877
- readonly letterSpacing: _angular_core.WritableSignal<DgaA11yLetterSpacing>;
1878
- readonly wordSpacing: _angular_core.WritableSignal<DgaA11yWordSpacing>;
1879
- /** Half-height of the reading-mask band in px (20–160). */
1880
- readonly maskBand: _angular_core.WritableSignal<number>;
1881
- /** Center Y of the reading-mask band in px. */
1882
- readonly maskY: _angular_core.WritableSignal<number>;
1883
- readonly reduceMotion: _angular_core.Signal<boolean>;
1884
- readonly highlightLinks: _angular_core.Signal<boolean>;
1885
- readonly highlightTitles: _angular_core.Signal<boolean>;
1886
- readonly highContrast: _angular_core.Signal<boolean>;
1887
- readonly dyslexia: _angular_core.Signal<boolean>;
1888
- readonly readingMask: _angular_core.Signal<boolean>;
1889
- readonly motorTargets: _angular_core.Signal<boolean>;
1890
- /**
1891
- * Reactive UI locale — kept in sync with `<html lang>` / `data-locale`
1892
- * (including when `DgaLocaleService` updates the document).
1893
- */
1894
- readonly locale: _angular_core.WritableSignal<"ar" | "en">;
1895
- private readonly effectiveModes;
1896
- private localeObserver;
1897
- constructor();
1898
- open(opener?: HTMLElement | null): void;
1899
- close(): void;
1900
- toggle(opener?: HTMLElement | null): void;
1901
- hasMode(mode: DgaA11yMode): boolean;
1902
- isBundle(mode: DgaA11yMode): mode is DgaA11yBundle;
1903
- toggleMode(mode: DgaA11yMode): void;
1904
- /** Explicitly enable or disable a mode/bundle (avoids switch double-toggle bugs). */
1905
- setMode(mode: DgaA11yMode, enabled: boolean): void;
1906
- setVisualFilter(filter: DgaA11yVisualFilter): void;
1907
- cycleFontStep(): void;
1908
- cycleTextAlign(): void;
1909
- cycleLineHeight(): void;
1910
- cycleLetterSpacing(): void;
1911
- cycleWordSpacing(): void;
1912
- /** Step font size (−1 / +1), wrapping within available levels. */
1913
- stepFontStep(delta: number): void;
1914
- stepTextAlign(delta: number): void;
1915
- stepLineHeight(delta: number): void;
1916
- stepLetterSpacing(delta: number): void;
1917
- stepWordSpacing(delta: number): void;
1918
- adjustMaskBand(delta: number): void;
1919
- setMaskY(y: number): void;
1920
- reset(): void;
1921
- announce(msg: string): void;
1922
- /** Current UI locale inferred from `<html lang>` / `data-locale`. */
1923
- private readDomLocale;
1924
- /** Keep `locale` reactive when portal / DgaLocaleService mutates `<html>`. */
1925
- private bindLocaleObserver;
1926
- /**
1927
- * Toggle AR/EN on `<html>` (`lang` / `dir` / `data-locale`).
1928
- * Compatible with DgaLocaleService attribute contract.
1929
- */
1930
- toggleLocale(): 'ar' | 'en';
1931
- activeModeCount(section: 'modes' | 'readable' | 'visual'): number;
1932
- /** Total active settings across profiles + tools + filters (for FAB badge). */
1933
- activeSettingCount(): number;
1934
- private applyBundleExtras;
1935
- private ensureDyslexiaFont;
1936
- private applyToDocument;
1937
- private persist;
1938
- private hydrate;
1939
- private bindOsPreferences;
1940
- private ensureLiveRegion;
1941
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAccessibilityService, never>;
1942
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<DgaAccessibilityService>;
1943
- }
1944
-
1945
- type DgaAccessibilityPosition = 'end' | 'start' | 'left' | 'right';
1946
- type AdjustToggleId = 'dyslexia' | 'highlight-titles' | 'highlight-links' | 'reading-mask' | 'reduce-motion';
1947
- type AdjustStepperId = 'font' | 'align' | 'line' | 'letter' | 'word';
1948
- declare class DgaAccessibility {
1949
- readonly a11y: DgaAccessibilityService;
1950
- readonly position: _angular_core.InputSignal<DgaAccessibilityPosition>;
1951
- /**
1952
- * 0-based slot in the shared FAB dock (bottom → top).
1953
- * Typical: a11y=0, chatbot=1, scroll-top=2.
1954
- */
1955
- readonly stack: _angular_core.InputSignalWithTransform<number, unknown>;
1956
- readonly panelId = "dga-accessibility-panel";
1957
- private readonly panelRef;
1958
- readonly fabBottom: _angular_core.Signal<string>;
1959
- readonly resetArmed: _angular_core.WritableSignal<boolean>;
1960
- readonly liveMsg: _angular_core.WritableSignal<string>;
1961
- private resetTimer;
1962
- private draggingMask;
1963
- readonly copy: _angular_core.Signal<{
1964
- open: string;
1965
- close: string;
1966
- panelLabel: string;
1967
- title: string;
1968
- sectionActive: string;
1969
- sectionProfiles: string;
1970
- sectionAdjust: string;
1971
- sectionFilters: string;
1972
- profilesHint: string;
1973
- chipJump: string;
1974
- stepDecrease: string;
1975
- stepIncrease: string;
1976
- reset: string;
1977
- resetConfirm: string;
1978
- announcedReset: string;
1979
- fontSize: string;
1980
- dyslexia: string;
1981
- highlightTitles: string;
1982
- highlightLinks: string;
1983
- readingMask: string;
1984
- reduceMotion: string;
1985
- textAlign: string;
1986
- lineHeight: string;
1987
- letterSpacing: string;
1988
- wordSpacing: string;
1989
- filterBoost: string;
1990
- filterMono: string;
1991
- filterHigh: string;
1992
- filterHighSat: string;
1993
- filterLowSat: string;
1994
- filterDeutan: string;
1995
- maskToolbar: string;
1996
- maskSmaller: string;
1997
- maskLarger: string;
1998
- maskDrag: string;
1999
- maskClose: string;
2000
- stateOn: string;
2001
- stateOff: string;
2002
- defaultValue: string;
2003
- fontLevels: string[];
2004
- alignLevels: string[];
2005
- lineLevels: string[];
2006
- letterLevels: string[];
2007
- wordLevels: string[];
2008
- bundles: {
2009
- 'epilepsy-safe': {
2010
- label: string;
2011
- desc: string;
2012
- };
2013
- 'visually-impaired': {
2014
- label: string;
2015
- desc: string;
2016
- };
2017
- 'cognitive-disability': {
2018
- label: string;
2019
- desc: string;
2020
- };
2021
- 'motor-impaired': {
2022
- label: string;
2023
- desc: string;
2024
- };
2025
- colorblind: {
2026
- label: string;
2027
- desc: string;
2028
- };
2029
- 'dyslexia-friendly': {
2030
- label: string;
2031
- desc: string;
2032
- };
2033
- 'adhd-friendly': {
2034
- label: string;
2035
- desc: string;
2036
- };
2037
- };
2038
- }>;
2039
- readonly bundles: _angular_core.Signal<{
2040
- id: DgaA11yBundle;
2041
- icon: DgaIconName;
2042
- label: string;
2043
- desc: string;
2044
- }[]>;
2045
- readonly adjustToggles: _angular_core.Signal<{
2046
- id: AdjustToggleId;
2047
- mode: DgaA11yMode;
2048
- icon: DgaIconName;
2049
- label: string;
2050
- active: boolean;
2051
- }[]>;
2052
- readonly adjustSteppers: _angular_core.Signal<{
2053
- id: AdjustStepperId;
2054
- icon: DgaIconName;
2055
- label: string;
2056
- active: boolean;
2057
- valueLabel: string;
2058
- }[]>;
2059
- readonly visualTiles: _angular_core.Signal<{
2060
- value: Exclude<DgaA11yVisualFilter, "none">;
2061
- label: string;
2062
- icon: DgaIconName;
2063
- active: boolean;
2064
- }[]>;
2065
- readonly activeChips: _angular_core.Signal<{
2066
- id: string;
2067
- label: string;
2068
- controlId: string;
2069
- }[]>;
2070
- readonly activeBadgeCount: _angular_core.Signal<number>;
2071
- readonly fabClasses: _angular_core.Signal<string>;
2072
- readonly panelClasses: _angular_core.Signal<string>;
2073
- constructor();
2074
- onKeydown(event: KeyboardEvent): void;
2075
- onPointerMove(event: PointerEvent): void;
2076
- onPointerUp(): void;
2077
- onFabClick(event: MouseEvent): void;
2078
- onBundle(id: DgaA11yBundle, enabled: boolean): void;
2079
- onToggleMode(mode: DgaA11yMode, enabled?: boolean): void;
2080
- onStep(id: AdjustStepperId, delta: number): void;
2081
- onFilter(value: DgaA11yVisualFilter): void;
2082
- focusControl(controlId: string): void;
2083
- onReset(): void;
2084
- onMaskDragStart(event: PointerEvent): void;
2085
- private panelPositionClass;
2086
- private announce;
2087
- private onMaskKeys;
2088
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAccessibility, never>;
2089
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAccessibility, "dga-accessibility", never, { "position": { "alias": "position"; "required": false; "isSignal": true; }; "stack": { "alias": "stack"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2090
- }
2091
-
2092
1958
  /**
2093
1959
  * Visually hidden until focused — first tab stop for keyboard users.
2094
1960
  * Place near the top of the document; `href` should target main content id.
@@ -2096,6 +1962,7 @@ declare class DgaAccessibility {
2096
1962
  declare class DgaSkipLink {
2097
1963
  readonly href: _angular_core.InputSignal<string>;
2098
1964
  readonly label: _angular_core.InputSignal<string>;
1965
+ safeHref(href: string | undefined | null): string;
2099
1966
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSkipLink, never>;
2100
1967
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSkipLink, "dga-skip-link", never, { "href": { "alias": "href"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2101
1968
  }
@@ -2142,17 +2009,65 @@ interface DgaBreadcrumbItem {
2142
2009
  href?: string;
2143
2010
  }
2144
2011
  type DgaBreadcrumbSeparator = 'chevron' | 'slash';
2012
+ type BreadcrumbSlot = {
2013
+ kind: 'item';
2014
+ item: DgaBreadcrumbItem;
2015
+ index: number;
2016
+ current: boolean;
2017
+ } | {
2018
+ kind: 'collapse';
2019
+ hidden: DgaBreadcrumbItem[];
2020
+ };
2021
+ /**
2022
+ * Breadcrumb trail with collapse + label truncation for long paths.
2023
+ *
2024
+ * ```html
2025
+ * <dga-breadcrumb [items]="crumbs" [maxItems]="4" />
2026
+ * ```
2027
+ *
2028
+ * When `items.length > maxItems`, middle crumbs collapse behind an ellipsis menu.
2029
+ * Set `maxItems` to `0` to disable collapse. Long labels truncate when `truncate` is on.
2030
+ */
2145
2031
  declare class DgaBreadcrumb {
2032
+ private readonly host;
2033
+ private readonly destroyRef;
2146
2034
  private readonly baseHref;
2035
+ private static seq;
2036
+ readonly menuId: string;
2147
2037
  readonly items: _angular_core.InputSignal<DgaBreadcrumbItem[]>;
2148
2038
  readonly label: _angular_core.InputSignal<string>;
2149
2039
  readonly separator: _angular_core.InputSignal<DgaBreadcrumbSeparator>;
2040
+ /**
2041
+ * Collapse middle items when the trail is longer than this.
2042
+ * `0` disables collapse.
2043
+ */
2044
+ readonly maxItems: _angular_core.InputSignalWithTransform<number, unknown>;
2045
+ /** Crumbs kept at the start when collapsing. */
2046
+ readonly itemsBeforeCollapse: _angular_core.InputSignalWithTransform<number, unknown>;
2047
+ /** Crumbs kept at the end when collapsing (includes current page). */
2048
+ readonly itemsAfterCollapse: _angular_core.InputSignalWithTransform<number, unknown>;
2049
+ /** Truncate long labels with ellipsis. */
2050
+ readonly truncate: _angular_core.InputSignalWithTransform<boolean, unknown>;
2051
+ /** Accessible name for the overflow (“…”) control. */
2052
+ readonly moreLabel: _angular_core.InputSignal<string>;
2150
2053
  /** Emits the clicked item for non-last links. Navigation via `href` is not prevented. */
2151
2054
  readonly itemClick: _angular_core.OutputEmitterRef<DgaBreadcrumbItem>;
2055
+ readonly overflowOpen: _angular_core.WritableSignal<boolean>;
2056
+ readonly slots: _angular_core.Signal<BreadcrumbSlot[]>;
2057
+ readonly listClasses: _angular_core.Signal<string>;
2058
+ readonly linkClasses: _angular_core.Signal<string>;
2059
+ readonly mutedClasses: _angular_core.Signal<string>;
2060
+ readonly currentClasses: _angular_core.Signal<string>;
2061
+ constructor();
2062
+ trackSlot(slot: BreadcrumbSlot, index: number): string;
2152
2063
  appHref(href: string | undefined | null): string;
2153
2064
  onItemClick(item: DgaBreadcrumbItem): void;
2065
+ toggleOverflow(event: MouseEvent): void;
2066
+ onOverflowItemClick(item: DgaBreadcrumbItem): void;
2067
+ onDocumentClick(event: MouseEvent): void;
2068
+ onDocumentKey(event: KeyboardEvent): void;
2154
2069
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaBreadcrumb, never>;
2155
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaBreadcrumb, "dga-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
2070
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaBreadcrumb, "dga-breadcrumb", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "separator": { "alias": "separator"; "required": false; "isSignal": true; }; "maxItems": { "alias": "maxItems"; "required": false; "isSignal": true; }; "itemsBeforeCollapse": { "alias": "itemsBeforeCollapse"; "required": false; "isSignal": true; }; "itemsAfterCollapse": { "alias": "itemsAfterCollapse"; "required": false; "isSignal": true; }; "truncate": { "alias": "truncate"; "required": false; "isSignal": true; }; "moreLabel": { "alias": "moreLabel"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; }, never, never, true, never>;
2156
2071
  }
2157
2072
 
2158
2073
  declare class DgaPagination {
@@ -2263,6 +2178,11 @@ declare class DgaStepper {
2263
2178
  readonly steps: _angular_core.InputSignal<DgaStep[]>;
2264
2179
  readonly active: _angular_core.ModelSignal<number>;
2265
2180
  readonly label: _angular_core.InputSignal<string>;
2181
+ /**
2182
+ * Optional veto for step clicks (e.g. form wizard validation).
2183
+ * Return false to keep the current step.
2184
+ */
2185
+ readonly beforeActiveChange: _angular_core.InputSignal<((next: number, current: number) => boolean) | undefined>;
2266
2186
  stepStatus(index: number): DgaStepStatus;
2267
2187
  stepButtonClasses(index: number): string;
2268
2188
  labelClasses(index: number): string;
@@ -2270,7 +2190,7 @@ declare class DgaStepper {
2270
2190
  railTone(index: number): string;
2271
2191
  go(index: number): void;
2272
2192
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaStepper, never>;
2273
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaStepper, "dga-stepper", never, { "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; }, never, never, true, never>;
2193
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaStepper, "dga-stepper", never, { "steps": { "alias": "steps"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "beforeActiveChange": { "alias": "beforeActiveChange"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; }, never, never, true, never>;
2274
2194
  }
2275
2195
 
2276
2196
  interface DgaTocItem {
@@ -2324,7 +2244,7 @@ declare class DgaSideNav {
2324
2244
  /**
2325
2245
  * `auto` = horizontal chips below lg; `vertical` = always sidebar (use in drawers).
2326
2246
  */
2327
- readonly layout: _angular_core.InputSignal<"auto" | "vertical">;
2247
+ readonly layout: _angular_core.InputSignal<"vertical" | "auto">;
2328
2248
  readonly label: _angular_core.InputSignal<string>;
2329
2249
  readonly toggleLabel: _angular_core.InputSignal<string>;
2330
2250
  readonly select: _angular_core.OutputEmitterRef<DgaSideNavItem>;
@@ -2342,6 +2262,7 @@ declare class DgaSideNav {
2342
2262
  onSelect(item: DgaSideNavItem, event?: Event): void;
2343
2263
  private childIsActive;
2344
2264
  private toggleExpanded;
2265
+ safeHref(href: string | undefined | null): string;
2345
2266
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSideNav, never>;
2346
2267
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSideNav, "dga-side-nav", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "collapsible": { "alias": "collapsible"; "required": false; "isSignal": true; }; "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "toggleLabel": { "alias": "toggleLabel"; "required": false; "isSignal": true; }; "narrow": { "alias": "narrow"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "select": "select"; "narrow": "narrowChange"; }, never, never, true, never>;
2347
2268
  }
@@ -2436,6 +2357,7 @@ declare class DgaNavRail {
2436
2357
  onSelect(item: DgaNavRailItem, event?: MouseEvent): void;
2437
2358
  toggleExpand(): void;
2438
2359
  private prefersReducedMotion;
2360
+ safeHref(href: string | undefined | null): string;
2439
2361
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaNavRail, never>;
2440
2362
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaNavRail, "dga-nav-rail", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "expandLabel": { "alias": "expandLabel"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "activeStyle": { "alias": "activeStyle"; "required": false; "isSignal": true; }; "offset": { "alias": "offset"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; "smoothScroll": { "alias": "smoothScroll"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "expanded": "expandedChange"; "select": "select"; "expandChange": "expandChange"; }, never, never, true, never>;
2441
2363
  }
@@ -2592,6 +2514,7 @@ declare class DgaCard {
2592
2514
  iconGlyphSize(): DgaIconSize;
2593
2515
  actionsHostClass(): string;
2594
2516
  builtInActionsClass(): string;
2517
+ safeHref(href: string | undefined | null): string;
2595
2518
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCard, never>;
2596
2519
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCard, "dga-card", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "border": { "alias": "border"; "required": false; "isSignal": true; }; "shadow": { "alias": "shadow"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "titleTruncate": { "alias": "titleTruncate"; "required": false; "isSignal": true; }; "descriptionClamp": { "alias": "descriptionClamp"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "iconSize": { "alias": "iconSize"; "required": false; "isSignal": true; }; "iconAppearance": { "alias": "iconAppearance"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; "badgeSize": { "alias": "badgeSize"; "required": false; "isSignal": true; }; "primaryLabel": { "alias": "primaryLabel"; "required": false; "isSignal": true; }; "primaryHref": { "alias": "primaryHref"; "required": false; "isSignal": true; }; "primaryVariant": { "alias": "primaryVariant"; "required": false; "isSignal": true; }; "secondaryLabel": { "alias": "secondaryLabel"; "required": false; "isSignal": true; }; "secondaryHref": { "alias": "secondaryHref"; "required": false; "isSignal": true; }; "secondaryVariant": { "alias": "secondaryVariant"; "required": false; "isSignal": true; }; "actionSize": { "alias": "actionSize"; "required": false; "isSignal": true; }; "actionsAlign": { "alias": "actionsAlign"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; }, { "primaryClick": "primaryClick"; "secondaryClick": "secondaryClick"; }, never, ["[dgaCardMedia]", "[dgaCardLead]", "*", "[dgaCardActions]"], true, never>;
2597
2520
  }
@@ -2697,360 +2620,6 @@ declare class DgaAppShell {
2697
2620
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAppShell, "dga-app-shell", never, { "navLabel": { "alias": "navLabel"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "padded": { "alias": "padded"; "required": false; "isSignal": true; }; }, {}, never, [".dga-app-shell-brand, [dgaAppShellBrand]", ".dga-app-shell-nav, [dgaAppShellNav]", ".dga-app-shell-nav-foot, [dgaAppShellNavFoot]", ".dga-app-shell-header, [dgaAppShellHeader]", "*"], true, never>;
2698
2621
  }
2699
2622
 
2700
- type DgaHeaderAppearance = 'default' | 'portal';
2701
- /**
2702
- * Mobile / narrow navigation chrome (portal header, `md` and below):
2703
- * - `sheet` - side drawer from the inline-end (burger) edge
2704
- * - `fullscreen` - full-viewport overlay panel
2705
- * - `push` - panel expands under the header bar (inline dropdown)
2706
- */
2707
- type DgaMobileNavMode = 'sheet' | 'fullscreen' | 'push';
2708
- /** Panel chrome: compact under trigger, full-bleed mega, or mega + featured lead. */
2709
- type DgaNavDropdownVariant = 'menu' | 'mega' | 'featured';
2710
- /** How links are arranged inside the panel. */
2711
- type DgaNavDropdownLayout = 'list' | 'columns' | 'rows';
2712
- interface DgaNavLink {
2713
- label: string;
2714
- href?: string;
2715
- description?: string;
2716
- current?: boolean;
2717
- }
2718
- interface DgaNavColumn {
2719
- title?: string;
2720
- links: DgaNavLink[];
2721
- }
2722
- /** Lead / promo block for `variant: 'featured'`. */
2723
- interface DgaNavFeatured {
2724
- title: string;
2725
- description?: string;
2726
- href?: string;
2727
- cta?: string;
2728
- imageUrl?: string;
2729
- }
2730
- interface DgaNavDropdown {
2731
- /**
2732
- * Panel width/placement:
2733
- * - `menu` - compact panel anchored under the trigger (default for simple lists)
2734
- * - `mega` - full-width under the header
2735
- * - `featured` - full-width mega with a lead promo column
2736
- */
2737
- variant?: DgaNavDropdownVariant;
2738
- /** Inner arrangement: `list` | `columns` | `rows`. */
2739
- layout?: DgaNavDropdownLayout;
2740
- columns?: DgaNavColumn[];
2741
- links?: DgaNavLink[];
2742
- featured?: DgaNavFeatured;
2743
- }
2744
- interface DgaNavItem {
2745
- label: string;
2746
- href?: string;
2747
- current?: boolean;
2748
- dropdown?: DgaNavDropdown;
2749
- }
2750
- interface DgaHeaderAction {
2751
- id: string;
2752
- label: string;
2753
- icon?: DgaIconName;
2754
- href?: string;
2755
- badge?: number;
2756
- iconOnly?: boolean;
2757
- }
2758
- /** Suggestion chip shown under the header search field. */
2759
- interface DgaHeaderSearchSuggestion {
2760
- label: string;
2761
- /** Value written into the query (defaults to `label`). */
2762
- value?: string;
2763
- icon?: DgaIconName;
2764
- }
2765
- /**
2766
- * Built-in header search popup (opens from the action whose `id` matches `actionId`).
2767
- * Pass this to `[search]` to enable the modal search experience.
2768
- */
2769
- interface DgaHeaderSearchConfig {
2770
- /** Action id that toggles the panel. Default: `'search'`. */
2771
- actionId?: string;
2772
- /** Modal title. Default: `'Search'`. */
2773
- title?: string;
2774
- description?: string;
2775
- closeLabel?: string;
2776
- placeholder?: string;
2777
- submitLabel?: string;
2778
- suggestionsLabel?: string;
2779
- clearLabel?: string;
2780
- voiceLabel?: string;
2781
- /** Show microphone control (uses Web Speech API when available). Default: true. */
2782
- voice?: boolean;
2783
- suggestions?: DgaHeaderSearchSuggestion[];
2784
- /**
2785
- * Optional results URL. On submit, navigates to
2786
- * `{resultsHref}?{queryParam}={query}` when set.
2787
- */
2788
- resultsHref?: string;
2789
- /** Query string key. Default: `'q'`. */
2790
- queryParam?: string;
2791
- }
2792
- type DgaHeaderNotificationTone = DgaBadgeVariant;
2793
- /** Single item in the header notifications panel. */
2794
- interface DgaHeaderNotification {
2795
- id: string;
2796
- title: string;
2797
- message: string;
2798
- statusLabel?: string;
2799
- tone?: DgaHeaderNotificationTone;
2800
- icon?: DgaIconName;
2801
- href?: string;
2802
- read?: boolean;
2803
- }
2804
- /**
2805
- * Built-in notifications dropdown for the action whose `id` matches `actionId`
2806
- * (default `'notifications'`).
2807
- */
2808
- interface DgaHeaderNotificationsConfig {
2809
- actionId?: string;
2810
- /** Panel heading. Default: `'Notifications'`. */
2811
- title?: string;
2812
- emptyLabel?: string;
2813
- viewAllLabel?: string;
2814
- viewAllHref?: string;
2815
- markReadLabel?: string;
2816
- markAllReadLabel?: string;
2817
- viewLabel?: string;
2818
- dismissLabel?: string;
2819
- closeLabel?: string;
2820
- items?: DgaHeaderNotification[];
2821
- }
2822
- type DgaHeaderNotificationAction = 'read' | 'view' | 'dismiss' | 'select';
2823
- /** Guest login form opened from the login action. */
2824
- interface DgaHeaderLoginConfig {
2825
- actionId?: string;
2826
- title?: string;
2827
- description?: string;
2828
- emailLabel?: string;
2829
- emailPlaceholder?: string;
2830
- emailHint?: string;
2831
- passwordLabel?: string;
2832
- passwordPlaceholder?: string;
2833
- passwordHint?: string;
2834
- submitLabel?: string;
2835
- cancelLabel?: string;
2836
- closeLabel?: string;
2837
- forgotPasswordLabel?: string;
2838
- forgotPasswordHref?: string;
2839
- showPasswordLabel?: string;
2840
- hidePasswordLabel?: string;
2841
- }
2842
- interface DgaHeaderUserMenuLink {
2843
- id: string;
2844
- label: string;
2845
- href?: string;
2846
- icon?: DgaIconName;
2847
- danger?: boolean;
2848
- }
2849
- /** Authenticated user menu shown after login (same action id as login). */
2850
- interface DgaHeaderUserConfig {
2851
- name: string;
2852
- role?: string;
2853
- email?: string;
2854
- avatarSrc?: string;
2855
- links?: DgaHeaderUserMenuLink[];
2856
- }
2857
- declare class DgaHeader {
2858
- private readonly host;
2859
- private readonly baseHref;
2860
- private closeTimer;
2861
- private dropdownSyncFrame;
2862
- private lastDropdownStyleKey;
2863
- readonly collapseId = "dga-nav-collapse";
2864
- readonly dropLink: string;
2865
- readonly dropTile: string;
2866
- readonly mobileLink: string;
2867
- readonly brand: _angular_core.InputSignal<string>;
2868
- readonly brandSlogan: _angular_core.InputSignal<string>;
2869
- readonly brandLogo: _angular_core.InputSignal<string>;
2870
- readonly brandLogoAlt: _angular_core.InputSignal<string>;
2871
- /** When true and no `brandLogo`, portal headers show a home-icon placeholder beside the brand text. */
2872
- readonly brandPlaceholder: _angular_core.InputSignalWithTransform<boolean, unknown>;
2873
- readonly brandHref: _angular_core.InputSignal<string>;
2874
- readonly navLabel: _angular_core.InputSignal<string>;
2875
- readonly menuToggleLabel: _angular_core.InputSignal<string>;
2876
- readonly menuCloseLabel: _angular_core.InputSignal<string>;
2877
- readonly appearance: _angular_core.InputSignal<DgaHeaderAppearance>;
2878
- /**
2879
- * Portal mobile navigation layout. Ignored for `appearance="default"`.
2880
- * - `sheet` - side drawer (narrow, page peeks beside)
2881
- * - `fullscreen` - covers the whole screen with its own close control
2882
- * - `push` - accordion panel under the header
2883
- */
2884
- readonly mobileNav: _angular_core.InputSignal<DgaMobileNavMode>;
2885
- readonly sticky: _angular_core.InputSignalWithTransform<boolean, unknown>;
2886
- readonly items: _angular_core.InputSignal<DgaNavItem[]>;
2887
- readonly actions: _angular_core.InputSignal<DgaHeaderAction[]>;
2888
- /**
2889
- * When set, the header action matching `search.actionId` (default `'search'`)
2890
- * opens a full-width search panel with suggestions instead of a no-op click.
2891
- */
2892
- readonly search: _angular_core.InputSignal<DgaHeaderSearchConfig | null>;
2893
- /** Bound query for the header search panel. */
2894
- readonly searchQuery: _angular_core.ModelSignal<string>;
2895
- /**
2896
- * When set, the header action matching `notifications.actionId`
2897
- * (default `'notifications'`) opens the notifications dropdown.
2898
- */
2899
- readonly notifications: _angular_core.InputSignal<DgaHeaderNotificationsConfig | null>;
2900
- /**
2901
- * Guest login panel config. Opens from the action matching `login.actionId`
2902
- * (default `'login'`). After auth, the same action opens the user menu.
2903
- */
2904
- readonly login: _angular_core.InputSignal<DgaHeaderLoginConfig | null>;
2905
- /** Authenticated user profile shown in the account menu. */
2906
- readonly user: _angular_core.InputSignal<DgaHeaderUserConfig | null>;
2907
- /** Whether the user is signed in (two-way). */
2908
- readonly authenticated: _angular_core.ModelSignal<boolean>;
2909
- readonly actionClick: _angular_core.OutputEmitterRef<DgaHeaderAction>;
2910
- readonly searchSubmit: _angular_core.OutputEmitterRef<string>;
2911
- readonly searchSuggestionSelect: _angular_core.OutputEmitterRef<DgaHeaderSearchSuggestion>;
2912
- readonly searchVoice: _angular_core.OutputEmitterRef<void>;
2913
- readonly notificationAction: _angular_core.OutputEmitterRef<{
2914
- item: DgaHeaderNotification;
2915
- action: DgaHeaderNotificationAction;
2916
- }>;
2917
- readonly loginSubmit: _angular_core.OutputEmitterRef<{
2918
- email: string;
2919
- password: string;
2920
- }>;
2921
- readonly logout: _angular_core.OutputEmitterRef<void>;
2922
- readonly userLinkClick: _angular_core.OutputEmitterRef<DgaHeaderUserMenuLink>;
2923
- /** Emits on click of any top-level nav link or dropdown link (desktop + mobile). */
2924
- readonly navLinkClick: _angular_core.OutputEmitterRef<DgaNavItem | DgaNavLink>;
2925
- readonly mobileOpen: _angular_core.WritableSignal<boolean>;
2926
- readonly openDropdown: _angular_core.WritableSignal<number | null>;
2927
- readonly searchOpen: _angular_core.WritableSignal<boolean>;
2928
- readonly notificationsOpen: _angular_core.WritableSignal<boolean>;
2929
- readonly loginOpen: _angular_core.WritableSignal<boolean>;
2930
- readonly userMenuOpen: _angular_core.WritableSignal<boolean>;
2931
- readonly voiceListening: _angular_core.WritableSignal<boolean>;
2932
- readonly expandedNotificationId: _angular_core.WritableSignal<string | null>;
2933
- readonly loginEmail: _angular_core.WritableSignal<string>;
2934
- readonly loginPassword: _angular_core.WritableSignal<string>;
2935
- readonly showLoginPassword: _angular_core.WritableSignal<boolean>;
2936
- readonly loginSubmitting: _angular_core.WritableSignal<boolean>;
2937
- /** Fixed coords for notifications / login / user panels (anchored to trigger). */
2938
- readonly dropdownPanelStyle: _angular_core.WritableSignal<Record<string, string>>;
2939
- private readonly dismissedNotificationIds;
2940
- private readonly readNotificationIds;
2941
- private dropdownTrigger;
2942
- private dropdownActionId;
2943
- private readonly injector;
2944
- private readonly searchInputRef;
2945
- readonly searchPanelId = "dga-header-search-panel";
2946
- readonly notificationsPanelId = "dga-header-notifications-panel";
2947
- readonly loginPanelId = "dga-header-login-panel";
2948
- readonly userPanelId = "dga-header-user-panel";
2949
- readonly isPortal: _angular_core.Signal<boolean>;
2950
- /** Resolve root-relative hrefs against the app base (`/dga/` on cPanel). */
2951
- appHref(href: string | undefined | null): string;
2952
- readonly searchConfig: _angular_core.Signal<DgaHeaderSearchConfig | null>;
2953
- readonly searchActionId: _angular_core.Signal<string>;
2954
- readonly notificationsConfig: _angular_core.Signal<DgaHeaderNotificationsConfig | null>;
2955
- readonly notificationsActionId: _angular_core.Signal<string>;
2956
- readonly loginConfig: _angular_core.Signal<DgaHeaderLoginConfig | null>;
2957
- readonly loginActionId: _angular_core.Signal<string>;
2958
- readonly userConfig: _angular_core.Signal<DgaHeaderUserConfig | null>;
2959
- readonly utilityOverlayOpen: _angular_core.Signal<boolean>;
2960
- readonly visibleNotifications: _angular_core.Signal<{
2961
- read: boolean;
2962
- id: string;
2963
- title: string;
2964
- message: string;
2965
- statusLabel?: string;
2966
- tone?: DgaHeaderNotificationTone;
2967
- icon?: DgaIconName;
2968
- href?: string;
2969
- }[]>;
2970
- readonly unreadNotificationCount: _angular_core.Signal<number>;
2971
- constructor();
2972
- /** Compact under-trigger menus are rendered inside the `<li>` (desktop only). */
2973
- readonly activeWideDropdown: _angular_core.Signal<{
2974
- index: number;
2975
- item: DgaNavItem;
2976
- variant: "mega" | "featured";
2977
- } | null>;
2978
- readonly hostClasses: _angular_core.Signal<string>;
2979
- readonly innerClasses: _angular_core.Signal<string>;
2980
- readonly desktopNavClasses: _angular_core.Signal<string>;
2981
- readonly actionsClasses: _angular_core.Signal<string>;
2982
- mobilePanelClass(): string;
2983
- hoverMenus(): boolean;
2984
- isMobileViewport(): boolean;
2985
- resolveVariant(item: DgaNavItem): DgaNavDropdownVariant;
2986
- resolveLayout(item: DgaNavItem): DgaNavDropdownLayout;
2987
- colCount(item: DgaNavItem): number;
2988
- flatLinks(item: DgaNavItem): DgaNavLink[];
2989
- columnsGridClass(count: number): string;
2990
- featuredGridClass(variant: DgaNavDropdownVariant, hasFeatured: boolean): string;
2991
- navItemClass(current: boolean, open?: boolean): string;
2992
- mobileItemClass(current: boolean, open?: boolean): string;
2993
- indicatorClass(active: boolean): string;
2994
- actionClass(_action: DgaHeaderAction): string;
2995
- badgeClass(): string;
2996
- isIconOnly(action: DgaHeaderAction): boolean;
2997
- isSearchAction(action: DgaHeaderAction): boolean;
2998
- isNotificationsAction(action: DgaHeaderAction): boolean;
2999
- isLoginAction(action: DgaHeaderAction): boolean;
3000
- actionTooltip(action: DgaHeaderAction): string;
3001
- actionAriaLabel(action: DgaHeaderAction): string;
3002
- actionExpanded(action: DgaHeaderAction): boolean | null;
3003
- actionControls(action: DgaHeaderAction): string | null;
3004
- actionIndicatorActive(action: DgaHeaderAction): boolean;
3005
- private clearCloseTimer;
3006
- private scheduleClose;
3007
- private setBodyScrollLocked;
3008
- private unlockBodyIfIdle;
3009
- onItemEnter(i: number): void;
3010
- onPanelEnter(): void;
3011
- onHostLeave(event: MouseEvent): void;
3012
- toggleMobile(): void;
3013
- toggleDropdown(i: number, event: Event): void;
3014
- closeAll(): void;
3015
- onAction(action: DgaHeaderAction, event?: Event): void;
3016
- onMobileAction(action: DgaHeaderAction, event?: Event): void;
3017
- closeUtilityOverlays(): void;
3018
- toggleSearch(): void;
3019
- onSearchModalOpenChange(open: boolean): void;
3020
- focusSearchInput(): void;
3021
- closeSearch(clearVoice?: boolean): void;
3022
- toggleNotifications(trigger?: HTMLElement | null): void;
3023
- closeNotifications(): void;
3024
- toggleLogin(trigger?: HTMLElement | null): void;
3025
- closeLogin(): void;
3026
- toggleUserMenu(trigger?: HTMLElement | null): void;
3027
- closeUserMenu(): void;
3028
- onLoginSubmit(event: Event): void;
3029
- onUserLink(link: DgaHeaderUserMenuLink): void;
3030
- toggleNotificationExpand(item: DgaHeaderNotification): void;
3031
- onNotificationAction(item: DgaHeaderNotification, action: DgaHeaderNotificationAction): void;
3032
- markAllNotificationsRead(): void;
3033
- clearSearchQuery(): void;
3034
- applySearchSuggestion(item: DgaHeaderSearchSuggestion): void;
3035
- onSearchFormSubmit(event: Event): void;
3036
- onSearchVoice(): void;
3037
- private speechRecognition;
3038
- private stopVoice;
3039
- private triggerFromEvent;
3040
- private scheduleDropdownSync;
3041
- private requestDropdownSync;
3042
- private clearDropdownAnchor;
3043
- private findActionTrigger;
3044
- private syncDropdownPanel;
3045
- onKey(event: KeyboardEvent): void;
3046
- onScroll(): void;
3047
- onResize(): void;
3048
- onNavLinkClick(link: DgaNavLink | DgaNavItem, event: MouseEvent): void;
3049
- onDocClick(event: MouseEvent): void;
3050
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaHeader, never>;
3051
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaHeader, "dga-header", never, { "brand": { "alias": "brand"; "required": false; "isSignal": true; }; "brandSlogan": { "alias": "brandSlogan"; "required": false; "isSignal": true; }; "brandLogo": { "alias": "brandLogo"; "required": false; "isSignal": true; }; "brandLogoAlt": { "alias": "brandLogoAlt"; "required": false; "isSignal": true; }; "brandPlaceholder": { "alias": "brandPlaceholder"; "required": false; "isSignal": true; }; "brandHref": { "alias": "brandHref"; "required": false; "isSignal": true; }; "navLabel": { "alias": "navLabel"; "required": false; "isSignal": true; }; "menuToggleLabel": { "alias": "menuToggleLabel"; "required": false; "isSignal": true; }; "menuCloseLabel": { "alias": "menuCloseLabel"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "mobileNav": { "alias": "mobileNav"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "searchQuery": { "alias": "searchQuery"; "required": false; "isSignal": true; }; "notifications": { "alias": "notifications"; "required": false; "isSignal": true; }; "login": { "alias": "login"; "required": false; "isSignal": true; }; "user": { "alias": "user"; "required": false; "isSignal": true; }; "authenticated": { "alias": "authenticated"; "required": false; "isSignal": true; }; }, { "searchQuery": "searchQueryChange"; "authenticated": "authenticatedChange"; "actionClick": "actionClick"; "searchSubmit": "searchSubmit"; "searchSuggestionSelect": "searchSuggestionSelect"; "searchVoice": "searchVoice"; "notificationAction": "notificationAction"; "loginSubmit": "loginSubmit"; "logout": "logout"; "userLinkClick": "userLinkClick"; "navLinkClick": "navLinkClick"; }, never, ["[dgaHeaderBrand]", "*", "[dgaHeaderEnd]"], true, never>;
3052
- }
3053
-
3054
2623
  interface DgaStampNotice {
3055
2624
  title: string;
3056
2625
  /** Substring of `title` rendered bold in the primary color (e.g. `gov.sa`). */
@@ -3109,6 +2678,7 @@ declare class DgaTopBar implements OnInit {
3109
2678
  toggle(): void;
3110
2679
  toggleCalendar(): void;
3111
2680
  toggleTimeFormat(): void;
2681
+ safeHref(href: string | undefined | null): string;
3112
2682
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTopBar, never>;
3113
2683
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTopBar, "dga-top-bar", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; "timeFormat": { "alias": "timeFormat"; "required": false; "isSignal": true; }; "showDate": { "alias": "showDate"; "required": false; "isSignal": true; }; "showTime": { "alias": "showTime"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "regionLabel": { "alias": "regionLabel"; "required": false; "isSignal": true; }; "stampLabel": { "alias": "stampLabel"; "required": false; "isSignal": true; }; "tabTextLg": { "alias": "tabTextLg"; "required": false; "isSignal": true; }; "tabTextSm": { "alias": "tabTextSm"; "required": false; "isSignal": true; }; "verifyText": { "alias": "verifyText"; "required": false; "isSignal": true; }; "registrationLabel": { "alias": "registrationLabel"; "required": false; "isSignal": true; }; "registrationId": { "alias": "registrationId"; "required": false; "isSignal": true; }; "registrationHref": { "alias": "registrationHref"; "required": false; "isSignal": true; }; "notices": { "alias": "notices"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "calendar": "calendarChange"; "timeFormat": "timeFormatChange"; }, never, ["*"], true, never>;
3114
2684
  }
@@ -3298,6 +2868,7 @@ declare class DgaHero {
3298
2868
  onPrimary(index?: number): void;
3299
2869
  onSecondary(index?: number): void;
3300
2870
  private clearAutoplay;
2871
+ safeHref(href: string | undefined | null): string;
3301
2872
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaHero, never>;
3302
2873
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaHero, "dga-hero", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "primaryCta": { "alias": "primaryCta"; "required": false; "isSignal": true; }; "secondaryCta": { "alias": "secondaryCta"; "required": false; "isSignal": true; }; "primaryHref": { "alias": "primaryHref"; "required": false; "isSignal": true; }; "secondaryHref": { "alias": "secondaryHref"; "required": false; "isSignal": true; }; "imageDesktop": { "alias": "imageDesktop"; "required": false; "isSignal": true; }; "imageMobile": { "alias": "imageMobile"; "required": false; "isSignal": true; }; "imageUrl": { "alias": "imageUrl"; "required": false; "isSignal": true; }; "imageOverlay": { "alias": "imageOverlay"; "required": false; "isSignal": true; }; "imageMaskVariant": { "alias": "imageMaskVariant"; "required": false; "isSignal": true; }; "slides": { "alias": "slides"; "required": false; "isSignal": true; }; "activeIndex": { "alias": "activeIndex"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "transition": { "alias": "transition"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "autoplayMs": { "alias": "autoplayMs"; "required": false; "isSignal": true; }; "showDots": { "alias": "showDots"; "required": false; "isSignal": true; }; "showArrows": { "alias": "showArrows"; "required": false; "isSignal": true; }; "dotsLabel": { "alias": "dotsLabel"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; }, { "activeIndex": "activeIndexChange"; "primaryClick": "primaryClick"; "secondaryClick": "secondaryClick"; "slideChange": "slideChange"; }, never, ["[dgaHeroBreadcrumb]", "[dgaHeroFloat]", "*", "*"], true, never>;
3303
2874
  }
@@ -3312,6 +2883,10 @@ declare class DgaPageHero {
3312
2883
  readonly description: _angular_core.InputSignal<string>;
3313
2884
  readonly breadcrumbs: _angular_core.InputSignal<DgaBreadcrumbItem[]>;
3314
2885
  readonly breadcrumbLabel: _angular_core.InputSignal<string>;
2886
+ /** Forwarded to `dga-breadcrumb` — collapse when trail exceeds this (`0` = off). */
2887
+ readonly breadcrumbMaxItems: _angular_core.InputSignalWithTransform<number, unknown>;
2888
+ readonly breadcrumbTruncate: _angular_core.InputSignalWithTransform<boolean, unknown>;
2889
+ readonly breadcrumbMoreLabel: _angular_core.InputSignal<string>;
3315
2890
  readonly tone: _angular_core.InputSignal<DgaPageHeroTone>;
3316
2891
  /** Extra bottom padding for denser pages. */
3317
2892
  readonly compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -3319,7 +2894,7 @@ declare class DgaPageHero {
3319
2894
  readonly titleId: string;
3320
2895
  readonly sectionClasses: _angular_core.Signal<string>;
3321
2896
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPageHero, never>;
3322
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPageHero, "dga-page-hero", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "breadcrumbs": { "alias": "breadcrumbs"; "required": false; "isSignal": true; }; "breadcrumbLabel": { "alias": "breadcrumbLabel"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, {}, never, ["[dgaPageHeroActions]", "*"], true, never>;
2897
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPageHero, "dga-page-hero", never, { "title": { "alias": "title"; "required": true; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; "breadcrumbs": { "alias": "breadcrumbs"; "required": false; "isSignal": true; }; "breadcrumbLabel": { "alias": "breadcrumbLabel"; "required": false; "isSignal": true; }; "breadcrumbMaxItems": { "alias": "breadcrumbMaxItems"; "required": false; "isSignal": true; }; "breadcrumbTruncate": { "alias": "breadcrumbTruncate"; "required": false; "isSignal": true; }; "breadcrumbMoreLabel": { "alias": "breadcrumbMoreLabel"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, {}, never, ["[dgaPageHeroActions]", "*"], true, never>;
3323
2898
  }
3324
2899
 
3325
2900
  type DgaAnnouncementTone = 'info' | 'warning' | 'success' | 'neutral' | 'critical' | 'brand';
@@ -3385,6 +2960,7 @@ declare class DgaAnnouncementBar {
3385
2960
  private storage;
3386
2961
  private readPersisted;
3387
2962
  private writePersisted;
2963
+ safeActionHref(): string;
3388
2964
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAnnouncementBar, never>;
3389
2965
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAnnouncementBar, "dga-announcement-bar", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "align": { "alias": "align"; "required": false; "isSignal": true; }; "actionVariant": { "alias": "actionVariant"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; "isSignal": true; }; "actionLabel": { "alias": "actionLabel"; "required": false; "isSignal": true; }; "actionHref": { "alias": "actionHref"; "required": false; "isSignal": true; }; "actionExternal": { "alias": "actionExternal"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "accent": { "alias": "accent"; "required": false; "isSignal": true; }; "initiallyDismissed": { "alias": "initiallyDismissed"; "required": false; "isSignal": true; }; "persist": { "alias": "persist"; "required": false; "isSignal": true; }; "persistKey": { "alias": "persistKey"; "required": false; "isSignal": true; }; }, { "dismissedChange": "dismissedChange"; "closed": "closed"; "action": "action"; }, never, ["*"], true, never>;
3390
2966
  }
@@ -3421,6 +2997,7 @@ declare class DgaSideInfo {
3421
2997
  isActive(item: DgaSideInfoItem): boolean;
3422
2998
  itemClasses(item: DgaSideInfoItem): string;
3423
2999
  onSelect(item: DgaSideInfoItem): void;
3000
+ safeHref(href: string | undefined | null): string;
3424
3001
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSideInfo, never>;
3425
3002
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSideInfo, "dga-side-info", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "active": { "alias": "active"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; "select": "select"; }, never, ["*"], true, never>;
3426
3003
  }
@@ -3515,6 +3092,80 @@ declare class DgaCode {
3515
3092
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCode, "dga-code", never, { "block": { "alias": "block"; "required": false; "isSignal": true; }; "language": { "alias": "language"; "required": false; "isSignal": true; }; }, {}, never, ["*", "*"], true, never>;
3516
3093
  }
3517
3094
 
3095
+ type DgaVideoProvider = 'auto' | 'youtube' | 'vimeo' | 'html5';
3096
+ type DgaVideoRatio = '16:9' | '4:3' | '1:1' | '9:16' | '21:9';
3097
+ interface DgaVideoSourceInfo {
3098
+ provider: Exclude<DgaVideoProvider, 'auto'>;
3099
+ /** Provider media id (YouTube / Vimeo) or original URL (html5). */
3100
+ id: string;
3101
+ fileUrl: string | null;
3102
+ }
3103
+ /** Resolve provider + safe playback URLs from a source string. */
3104
+ declare function dgaResolveVideoSource(src: string, provider?: DgaVideoProvider): DgaVideoSourceInfo | null;
3105
+ /**
3106
+ * Responsive video player for YouTube, Vimeo, and HTML5 (mp4/webm/…).
3107
+ *
3108
+ * ```html
3109
+ * <dga-video-player
3110
+ * src="https://www.youtube.com/watch?v=aqz-KE-bpKQ"
3111
+ * poster="/assets/poster.jpg"
3112
+ * title="Demo"
3113
+ * ratio="16:9"
3114
+ * />
3115
+ * ```
3116
+ *
3117
+ * Embeds default to click-to-load (`lazy`) for privacy/perf. HTML5 uses native controls.
3118
+ */
3119
+ declare class DgaVideoPlayer {
3120
+ private readonly sanitizer;
3121
+ /** Watch / share URL, embed URL, file URL, or bare YouTube/Vimeo id. */
3122
+ readonly src: _angular_core.InputSignal<string>;
3123
+ /** Force provider; default auto-detects from `src`. */
3124
+ readonly provider: _angular_core.InputSignal<DgaVideoProvider>;
3125
+ /** Poster image (HTML5 + lazy embed cover). */
3126
+ readonly poster: _angular_core.InputSignal<string>;
3127
+ /** Accessible / iframe title. */
3128
+ readonly title: _angular_core.InputSignal<string>;
3129
+ /** Show native / embed controls. */
3130
+ readonly controls: _angular_core.InputSignalWithTransform<boolean, unknown>;
3131
+ /** Autoplay (embeds load immediately; browsers usually require muted). */
3132
+ readonly autoplay: _angular_core.InputSignalWithTransform<boolean, unknown>;
3133
+ readonly muted: _angular_core.InputSignalWithTransform<boolean, unknown>;
3134
+ readonly loop: _angular_core.InputSignalWithTransform<boolean, unknown>;
3135
+ readonly playsInline: _angular_core.InputSignalWithTransform<boolean, unknown>;
3136
+ /**
3137
+ * Click-to-load for YouTube/Vimeo (privacy + faster page).
3138
+ * Ignored when `autoplay` is true.
3139
+ */
3140
+ readonly lazy: _angular_core.InputSignalWithTransform<boolean, unknown>;
3141
+ /** Prefer youtube-nocookie.com embeds. */
3142
+ readonly privacy: _angular_core.InputSignalWithTransform<boolean, unknown>;
3143
+ /** Start offset in seconds (YouTube / Vimeo). */
3144
+ readonly start: _angular_core.InputSignalWithTransform<number, unknown>;
3145
+ readonly ratio: _angular_core.InputSignal<DgaVideoRatio>;
3146
+ readonly rounded: _angular_core.InputSignalWithTransform<boolean, unknown>;
3147
+ /** Play button / iframe accessible name. */
3148
+ readonly playLabel: _angular_core.InputSignal<string>;
3149
+ readonly invalidLabel: _angular_core.InputSignal<string>;
3150
+ readonly unsupportedLabel: _angular_core.InputSignal<string>;
3151
+ readonly played: _angular_core.OutputEmitterRef<void>;
3152
+ readonly paused: _angular_core.OutputEmitterRef<void>;
3153
+ readonly ended: _angular_core.OutputEmitterRef<void>;
3154
+ readonly failed: _angular_core.OutputEmitterRef<Event>;
3155
+ readonly activatedChange: _angular_core.OutputEmitterRef<boolean>;
3156
+ readonly activated: _angular_core.WritableSignal<boolean>;
3157
+ readonly resolved: _angular_core.Signal<DgaVideoSourceInfo | null>;
3158
+ readonly providerBadge: _angular_core.Signal<"" | "YouTube" | "Vimeo">;
3159
+ readonly embedSrc: _angular_core.Signal<string | null>;
3160
+ readonly safeEmbed: _angular_core.Signal<SafeResourceUrl | null>;
3161
+ readonly shellClasses: _angular_core.Signal<string>;
3162
+ constructor();
3163
+ activate(): void;
3164
+ private buildEmbedUrl;
3165
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaVideoPlayer, never>;
3166
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaVideoPlayer, "dga-video-player", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "provider": { "alias": "provider"; "required": false; "isSignal": true; }; "poster": { "alias": "poster"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "controls": { "alias": "controls"; "required": false; "isSignal": true; }; "autoplay": { "alias": "autoplay"; "required": false; "isSignal": true; }; "muted": { "alias": "muted"; "required": false; "isSignal": true; }; "loop": { "alias": "loop"; "required": false; "isSignal": true; }; "playsInline": { "alias": "playsInline"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "privacy": { "alias": "privacy"; "required": false; "isSignal": true; }; "start": { "alias": "start"; "required": false; "isSignal": true; }; "ratio": { "alias": "ratio"; "required": false; "isSignal": true; }; "rounded": { "alias": "rounded"; "required": false; "isSignal": true; }; "playLabel": { "alias": "playLabel"; "required": false; "isSignal": true; }; "invalidLabel": { "alias": "invalidLabel"; "required": false; "isSignal": true; }; "unsupportedLabel": { "alias": "unsupportedLabel"; "required": false; "isSignal": true; }; }, { "played": "played"; "paused": "paused"; "ended": "ended"; "failed": "failed"; "activatedChange": "activatedChange"; }, never, never, true, never>;
3167
+ }
3168
+
3518
3169
  declare class DgaList {
3519
3170
  readonly ordered: _angular_core.InputSignalWithTransform<boolean, unknown>;
3520
3171
  readonly listClasses: _angular_core.Signal<string>;
@@ -3557,6 +3208,7 @@ declare class DgaInfoList {
3557
3208
  readonly copy: _angular_core.OutputEmitterRef<DgaInfoListItem>;
3558
3209
  readonly listClasses: _angular_core.Signal<string>;
3559
3210
  onCopy(item: DgaInfoListItem): void;
3211
+ safeHref(href: string | undefined | null): string;
3560
3212
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaInfoList, never>;
3561
3213
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaInfoList, "dga-info-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "copyLabel": { "alias": "copyLabel"; "required": false; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, { "copy": "copy"; }, never, never, true, never>;
3562
3214
  }
@@ -4025,5 +3677,20 @@ declare function dgaSaudiCityOptions(locale?: 'ar' | 'en', cities?: readonly Dga
4025
3677
  value: string;
4026
3678
  }[];
4027
3679
 
4028
- export { DGA_GREGORIAN_MONTHS, DGA_HIJRI_MONTHS, DGA_ICON_NAMES, DGA_ICON_SVG, DGA_LOGICAL_ICON_NAMES, DGA_PHONE_COUNTRIES, DGA_RIYAL_SVG_PATH, DGA_RIYAL_VIEWBOX, DGA_SAUDI_CITIES, DGA_WEEKDAYS, DgaAccessibility, DgaAccessibilityService, DgaAccordion, DgaAccordionItem, DgaAlert, DgaAnnouncementBar, DgaAppShell, DgaAuthCard, DgaAutocomplete, DgaAvatar, DgaBadge, DgaBreadcrumb, DgaButton, DgaCard, DgaCardMedia, DgaCarousel, DgaCarouselSlideDirective, DgaChart, DgaChatbot, DgaCheckbox, DgaChip, DgaChipInput, DgaClamp, DgaCode, DgaContentSwitcher, DgaContentSwitcherPanel, DgaCookies, DgaCopy, DgaDatePickerComponent as DgaDatePicker, DgaDescriptionList, DgaDialog, DgaDivider, DgaDrawer, DgaDualNav, DgaEmpty, DgaExpandable, DgaExport, DgaExportToolbar, DgaFeedback, DgaField, DgaFilterBar, DgaFooter, DgaFormControl, DgaFormEnd, DgaFormStart, DgaGrid, DgaHeader, DgaHero, DgaIcon, DgaIconBadge, DgaIconFontService, DgaImagePopup, DgaInfoList, DgaInput, DgaLabel, DgaLink, DgaList, DgaLogoTile, DgaMenu, DgaMetric, DgaModal, DgaMultiselect, DgaNativeSelect, DgaNavRail, DgaNumber, DgaNumberInput, DgaOtp, DgaPageFeedback, DgaPageHero, DgaPagination, DgaPersona, DgaPhoneInput, DgaPreloader, DgaProgress, DgaQuote, DgaRadio, DgaRating, DgaRiyal, DgaScrollTop, DgaSection, DgaSelect, DgaShare, DgaSideInfo, DgaSideNav, DgaSkeleton, DgaSkipLink, DgaSlider, DgaSpinner, DgaStepper, DgaSwitch, DgaTab, DgaTable, DgaTabs, DgaTimePicker, DgaTimeline, DgaToast, DgaToastOutlet, DgaToastService, DgaToc, DgaToolbar, DgaTooltip, DgaTopBar, DgaUpload, decodePlatformscodeSvg, dgaAddMonths, dgaClampDate, dgaCoerceDate, dgaCompareDays, dgaDaysInMonth, dgaFormatDate, dgaGetCalendarParts, dgaGroupSaudiCitiesByRegion, dgaModeFromFormat, dgaMonthNames, dgaMonthStartWeekday, dgaNormalizeTime, dgaParseDate, dgaPartsToDate, dgaProvideValueAccessor, dgaSameDay, dgaSaudiCityOptions, dgaTodayUtc };
4029
- export type { DgaA11yBundle, DgaA11yMode, DgaA11yVisualFilter, DgaAccessibilityPosition, DgaAccordionSection, DgaAlertDisplay, DgaAlertVariant, DgaAnnouncementActionVariant, DgaAnnouncementAlign, DgaAnnouncementDensity, DgaAnnouncementElevation, DgaAnnouncementPersist, DgaAnnouncementTone, DgaAppShellAppearance, DgaAutocompleteOption, DgaAvatarSize, DgaBadgeSize, DgaBadgeVariant, DgaBreadcrumbItem, DgaBreadcrumbSeparator, DgaButtonSize, DgaButtonVariant, DgaCalendar, DgaCalendarParts, DgaCardActionsAlign, DgaCardAppearance, DgaCardBadge, DgaCardBorder, DgaCardPadding, DgaCardShadow, DgaCarouselSlide, DgaChartDataset, DgaChartPoint, DgaChartType, DgaChatbotAnimation, DgaChatbotFabTone, DgaChatbotMessage, DgaChatbotPosition, DgaChatbotSize, DgaCheckboxSize, DgaChipVariant, DgaContentSwitcherItem, DgaCookieCategory, DgaCookieConsent, DgaCookieDecision, DgaCookiePreferences, DgaCookiesAlign, DgaCookiesPosition, DgaCurrency, DgaDateCalendar, DgaDatePickerMode, DgaDateRangeValue, DgaDescriptionItem, DgaDescriptionLayout, DgaDialogSize, DgaDividerOrientation, DgaDrawerSide, DgaDualNavCategory, DgaDualNavSection, DgaEmptyAppearance, DgaExportColumn, DgaExportData, DgaExportScope, DgaFeedbackSubmit, DgaFilterItem, DgaFooterAppearance, DgaFooterColumn, DgaFooterIconGroup, DgaFooterIconLink, DgaFooterLink, DgaFooterLogo, DgaFormControlSize, DgaFormStatus, DgaGridCols, DgaGridGap, DgaHeaderAction, DgaHeaderAppearance, DgaHeaderLoginConfig, DgaHeaderNotification, DgaHeaderNotificationAction, DgaHeaderNotificationTone, DgaHeaderNotificationsConfig, DgaHeaderSearchConfig, DgaHeaderSearchSuggestion, DgaHeaderUserConfig, DgaHeaderUserMenuLink, DgaHeroAppearance, DgaHeroImageMask, DgaHeroOverlayTone, DgaHeroSlide, DgaHeroTransition, DgaIconBadgeAppearance, DgaIconBadgeSize, DgaIconName, DgaIconSize, DgaIconTone, DgaImagePopupAnimation, DgaImagePopupImage, DgaImagePopupImageTransition, DgaImagePopupSource, DgaInfoListItem, DgaInputSize, DgaLinkVariant, DgaMenuItem, DgaMetricAppearance, DgaMetricTrend, DgaMobileNavMode, DgaModalAnimation, DgaModalSize, DgaMultiselectOption, DgaNativeSelectSize, DgaNavColumn, DgaNavDropdown, DgaNavDropdownLayout, DgaNavDropdownVariant, DgaNavFeatured, DgaNavItem, DgaNavLink, DgaNavRailActiveStyle, DgaNavRailAppearance, DgaNavRailItem, DgaNavRailPosition, DgaNavRailSize, DgaPageFeedbackAgreementLink, DgaPageFeedbackAnswer, DgaPageFeedbackOption, DgaPageFeedbackPhase, DgaPageFeedbackSubmit, DgaPageHeroTone, DgaPhoneCountry, DgaPreloaderPersist, DgaProgressAppearance, DgaProgressSize, DgaProgressTone, DgaRadioSize, DgaRatingSize, DgaRiyalAppearance, DgaRiyalSize, DgaRiyalTone, DgaSaudiCity, DgaScrollTopPosition, DgaSectionTone, DgaSectionWidth, DgaSelectOpenMode, DgaSelectOption, DgaSelectSize, DgaShareAppearance, DgaSideInfoItem, DgaSideNavGroup, DgaSideNavItem, DgaSkeletonAnimation, DgaSkeletonRadius, DgaSkeletonShape, DgaSkeletonSize, DgaSortDir, DgaSpinnerSize, DgaSpinnerTone, DgaStampNotice, DgaStep, DgaStepStatus, DgaSwitchSize, DgaTabItem, DgaTableColumn, DgaTableDensity, DgaTimeFormat, DgaTimePickerFormat, DgaTimePickerSize, DgaTimelineItem, DgaToastRequest, DgaToastShowOptions, DgaToastVariant, DgaTocItem, DgaTooltipPlacement, DgaTooltipVariant, DgaUploadAppearance, DgaUploadFile, DgaUploadRejectReason, DgaUploadRejection };
3680
+ declare function dgaResolveAppHref(href: string, baseHref?: string): string;
3681
+ /**
3682
+ * Safe href for config-driven links (CMS / schema).
3683
+ * Blocks dangerous schemes; keeps http(s), mailto, tel, hashes, and relative paths.
3684
+ */
3685
+ declare function dgaSafeHref(href: string | null | undefined, baseHref?: string): string;
3686
+
3687
+ declare function dgaSafeCssColor(value: string | null | undefined, fallback?: string): string;
3688
+
3689
+ /** Join truthy class names. */
3690
+ declare function dgaCx(...parts: Array<string | false | null | undefined>): string;
3691
+
3692
+ /** Infer UI locale from `<html lang>` (avoids importing `@a.nemreen/dga-tokens` into ng-packagr graph). */
3693
+ declare function dgaIsArabic(): boolean;
3694
+
3695
+ export { DGA_ICON_NAMES, DGA_ICON_SVG, DGA_LOGICAL_ICON_NAMES, DGA_PAGE_TRANSITION_NAMES, DGA_PHONE_COUNTRIES, DGA_RIYAL_SVG_PATH, DGA_RIYAL_VIEWBOX, DGA_SAUDI_CITIES, DgaAccordion, DgaAccordionItem, DgaAlert, DgaAnnouncementBar, DgaAppShell, DgaAuthCard, DgaAutocomplete, DgaAvatar, DgaBadge, DgaBreadcrumb, DgaButton, DgaCard, DgaCardMedia, DgaCarousel, DgaCarouselSlideDirective, DgaChart, DgaChatbot, DgaCheckbox, DgaChip, DgaChipInput, DgaClamp, DgaCode, DgaCommand, DgaContentSwitcher, DgaContentSwitcherPanel, DgaContextMenu, DgaContextMenuTrigger, DgaCopy, DgaDescriptionList, DgaDialog, DgaDivider, DgaDrawer, DgaDualNav, DgaEmpty, DgaExpandable, DgaExport, DgaExportToolbar, DgaFeedback, DgaField, DgaFilterBar, DgaFooter, DgaFormControl, DgaFormEnd, DgaFormStart, DgaGrid, DgaHero, DgaIcon, DgaIconBadge, DgaIconFontService, DgaImagePopup, DgaInfoList, DgaInput, DgaKbd, DgaKbdGroup, DgaLabel, DgaLink, DgaList, DgaLogoTile, DgaMenu, DgaMetric, DgaModal, DgaMultiselect, DgaNativeSelect, DgaNavRail, DgaNumber, DgaNumberInput, DgaOtp, DgaPageFeedback, DgaPageHero, DgaPageTransition, DgaPagination, DgaPersona, DgaPhoneInput, DgaPreloader, DgaProgress, DgaQuote, DgaRadio, DgaRating, DgaRiyal, DgaScrollTop, DgaSection, DgaSelect, DgaShare, DgaSideInfo, DgaSideNav, DgaSkeleton, DgaSkipLink, DgaSlider, DgaSpinner, DgaStepper, DgaSwitch, DgaTab, DgaTable, DgaTabs, DgaTimePicker, DgaTimeline, DgaToast, DgaToastOutlet, DgaToastService, DgaToc, DgaToolbar, DgaTooltip, DgaTopBar, DgaTour, DgaUpload, DgaVideoPlayer, DgaWriting, dgaCx, dgaFormStatusFromInvalid, dgaGroupSaudiCitiesByRegion, dgaIsArabic, dgaNormalizeTime, dgaProvideValueAccessor, dgaResolveAppHref, dgaResolveVideoSource, dgaSafeCssColor, dgaSafeHref, dgaSaudiCityOptions };
3696
+ export type { DgaAccordionSection, DgaAlertDisplay, DgaAlertVariant, DgaAnnouncementActionVariant, DgaAnnouncementAlign, DgaAnnouncementDensity, DgaAnnouncementElevation, DgaAnnouncementPersist, DgaAnnouncementTone, DgaAppShellAppearance, DgaAutocompleteOption, DgaAvatarSize, DgaBadgeSize, DgaBadgeVariant, DgaBreadcrumbItem, DgaBreadcrumbSeparator, DgaButtonSize, DgaButtonVariant, DgaCalendar, DgaCardActionsAlign, DgaCardAppearance, DgaCardBadge, DgaCardBorder, DgaCardPadding, DgaCardShadow, DgaCarouselSlide, DgaChartDataset, DgaChartPoint, DgaChartType, DgaChatbotAnimation, DgaChatbotFabTone, DgaChatbotMessage, DgaChatbotPosition, DgaChatbotSize, DgaCheckboxSize, DgaChipVariant, DgaCommandAppearance, DgaCommandGroup, DgaCommandItem, DgaContentSwitcherItem, DgaContextMenuItem, DgaContextMenuItemType, DgaCurrency, DgaDescriptionItem, DgaDescriptionLayout, DgaDialogSize, DgaDividerOrientation, DgaDrawerSide, DgaDualNavCategory, DgaDualNavSection, DgaEmptyAppearance, DgaExportColumn, DgaExportData, DgaExportScope, DgaFeedbackSubmit, DgaFilterItem, DgaFooterAppearance, DgaFooterColumn, DgaFooterIconGroup, DgaFooterIconLink, DgaFooterLink, DgaFooterLogo, DgaFormControlSize, DgaFormStatus, DgaGridCols, DgaGridGap, DgaHeroAppearance, DgaHeroImageMask, DgaHeroOverlayTone, DgaHeroSlide, DgaHeroTransition, DgaIconBadgeAppearance, DgaIconBadgeSize, DgaIconName, DgaIconSize, DgaIconTone, DgaImagePopupAnimation, DgaImagePopupImage, DgaImagePopupImageTransition, DgaImagePopupSource, DgaInfoListItem, DgaInputSize, DgaLinkVariant, DgaMenuItem, DgaMetricAppearance, DgaMetricTrend, DgaModalAnimation, DgaModalSize, DgaMultiselectOption, DgaNativeSelectSize, DgaNavRailActiveStyle, DgaNavRailAppearance, DgaNavRailItem, DgaNavRailPosition, DgaNavRailSize, DgaPageFeedbackAgreementLink, DgaPageFeedbackAnswer, DgaPageFeedbackOption, DgaPageFeedbackPhase, DgaPageFeedbackSubmit, DgaPageHeroTone, DgaPageTransitionName, DgaPhoneCountry, DgaPreloaderPersist, DgaProgressAppearance, DgaProgressSize, DgaProgressTone, DgaRadioSize, DgaRatingSize, DgaRiyalAppearance, DgaRiyalSize, DgaRiyalTone, DgaSaudiCity, DgaScrollTopPosition, DgaSectionTone, DgaSectionWidth, DgaSelectOpenMode, DgaSelectOption, DgaSelectSize, DgaShareAppearance, DgaSideInfoItem, DgaSideNavGroup, DgaSideNavItem, DgaSkeletonAnimation, DgaSkeletonRadius, DgaSkeletonShape, DgaSkeletonSize, DgaSortDir, DgaSpinnerSize, DgaSpinnerTone, DgaStampNotice, DgaStep, DgaStepStatus, DgaSwitchSize, DgaTabItem, DgaTableColumn, DgaTableDensity, DgaTimeFormat, DgaTimePickerFormat, DgaTimePickerSize, DgaTimelineItem, DgaToastAnimation, DgaToastLocation, DgaToastRequest, DgaToastShowOptions, DgaToastVariant, DgaTocItem, DgaTooltipPlacement, DgaTooltipVariant, DgaTourPersist, DgaTourPlacement, DgaTourStep, DgaUploadAppearance, DgaUploadFile, DgaUploadRejectReason, DgaUploadRejection, DgaVideoProvider, DgaVideoRatio, DgaVideoSourceInfo, DgaWritingEffect };