@a.nemreen/dga-ui 0.3.13 → 0.3.15

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,56 +1,11 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Type, Provider, Signal, OnDestroy, OnInit } from '@angular/core';
2
+ import { InjectionToken, EnvironmentProviders, Type, Provider, Signal, OnDestroy, OnInit, TemplateRef } from '@angular/core';
3
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
-
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<"none" | "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">;
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
- }
7
+ import * as _a_nemreen_dga_tokens from '@a.nemreen/dga-tokens';
8
+ import { DgaLocale } from '@a.nemreen/dga-tokens';
54
9
 
55
10
  type DgaWritingEffect = 'typewriter' | 'glow';
56
11
  /**
@@ -94,14 +49,20 @@ declare class DgaWriting {
94
49
 
95
50
  type DgaButtonVariant = 'primary' | 'secondary' | 'subtle' | 'outline' | 'outlineMuted' | 'outlineInverse' | 'ghost' | 'danger' | 'inverse';
96
51
  type DgaButtonSize = 'sm' | 'md' | 'lg';
52
+ /** Hover / focus motion. Default `opacity` preserves legacy chrome. */
53
+ type DgaButtonEffect = 'opacity' | 'ripple' | 'lift' | 'scale' | 'glow' | 'press' | 'bounce' | 'slide' | 'shine' | 'pulse' | 'float' | 'wobble' | 'jelly';
97
54
  declare class DgaButton {
98
55
  private readonly destroyRef;
99
56
  private readonly host;
100
57
  private readonly renderer;
101
58
  readonly variant: _angular_core.InputSignal<DgaButtonVariant>;
102
59
  readonly size: _angular_core.InputSignal<DgaButtonSize>;
60
+ /** Hover / focus motion. Default matches legacy opacity chrome. */
61
+ readonly effect: _angular_core.InputSignal<DgaButtonEffect>;
103
62
  /** Square control sized to the icon (no horizontal padding). */
104
63
  readonly iconOnly: _angular_core.InputSignalWithTransform<boolean, unknown>;
64
+ /** Stretch to the width of the parent (adds `w-full`). */
65
+ readonly fullWidth: _angular_core.InputSignalWithTransform<boolean, unknown>;
105
66
  /** When > 0, disables the host for this many ms after each click and shows a spinner. */
106
67
  readonly cooldownMs: _angular_core.InputSignal<number>;
107
68
  /** Manual loading state — shows spinner and disables the control. */
@@ -118,12 +79,14 @@ declare class DgaButton {
118
79
  readonly busy: _angular_core.Signal<boolean>;
119
80
  readonly classes: _angular_core.Signal<string>;
120
81
  constructor();
82
+ onPointerDown(event: Event): void;
121
83
  onHostClick(): void;
84
+ private spawnRipple;
122
85
  private attachSpinner;
123
86
  private detachSpinner;
124
87
  private clearCooldown;
125
88
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaButton, never>;
126
- static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaButton, "button[dgaButton], a[dgaButton]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "cooldownMs": { "alias": "cooldownMs"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "buttonClass": { "alias": "dgaButtonClass"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
89
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaButton, "button[dgaButton], a[dgaButton]", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "fullWidth": { "alias": "fullWidth"; "required": false; "isSignal": true; }; "cooldownMs": { "alias": "cooldownMs"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "buttonClass": { "alias": "dgaButtonClass"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
127
90
  }
128
91
 
129
92
  type DgaBadgeVariant = 'neutral' | 'primary' | 'success' | 'info' | 'warning' | 'error';
@@ -281,18 +244,12 @@ declare class DgaAvatar {
281
244
  }
282
245
 
283
246
  /**
284
- * Curated inline icons for `@a.nemreen/dga-ui` chrome (buttons, fields, menus, …).
285
- * SVGs are vendored at build time — no runtime `@platformscode/icons` dependency.
286
- *
287
- * Content / editorial icons: opt into `@a.nemreen/dga-tokens/styles/icon-font.css` and use
288
- * `<dga-icon glyph="search-01" />` (or `hgi-stroke hgi-{name}` classes).
289
- *
290
- * Regenerated by: node scripts/vendor-dga-icons.mjs
247
+ * Icon name union + RTL-flip set. Kept off the SVG catalog so chrome
248
+ * components can import names without the HugeIcons glyph map.
291
249
  */
292
- 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';
293
- declare const DGA_ICON_SVG: Record<DgaIconName, string>;
294
- declare const DGA_ICON_NAMES: DgaIconName[];
295
- declare const DGA_LOGICAL_ICON_NAMES: Set<DgaIconName>;
250
+ declare const DGA_ICON_NAMES: readonly ["access", "alertCircle", "ambulance", "apple", "arrowDown", "arrowDown02", "arrowLeft", "arrowLeft02", "arrowNext", "arrowNext02", "arrowPrev", "arrowPrev02", "arrowRight", "arrowRight02", "arrowUp", "arrowUp02", "award", "badgeCheck", "bell", "bellAlt", "book", "bookType", "brain", "building", "calendar", "calendarAlt", "cart", "check", "checkCircle", "checkCircleAlt", "chevronDown", "chevronLeft", "chevronRight", "clock", "close", "cloud", "colorPicker", "colors", "cookie", "copy", "desert", "devices", "disability", "door", "download", "droplet", "error", "external", "eye", "eyeOff", "eyeOffSlash", "facebook", "filter", "fire", "flash", "folder", "glasses", "globe", "heading", "headphones", "helpCircle", "highlighter", "home", "huawei", "idCard", "info", "instagram", "letterSpacing", "link", "linkAlt", "linkedin", "location", "lock", "lockPassword", "logout", "mail", "mask", "maximize", "menu", "menuAlt", "message", "mic", "minus", "moon", "moonAlt", "moonCloud", "moreHorizontal", "moreVertical", "paintBoard", "pause", "phone", "playStore", "plus", "plusSign", "police", "printer", "rain", "rainZap", "refresh", "riyal", "search", "share", "shrink", "smartphone", "snow", "sort", "sortDown", "sortUp", "star", "starFilled", "success", "sun", "sunAlt", "sunCloud", "textAlign", "textFont", "textUnderline", "touch", "tradeDown", "tradeUp", "translation", "upload", "user", "users", "warning", "whatsapp", "wheelchair", "wind", "x", "youtube", "zoomIn", "zoomOut"];
251
+ type DgaIconName = (typeof DGA_ICON_NAMES)[number];
252
+ declare const DGA_LOGICAL_ICON_NAMES: Set<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut">;
296
253
 
297
254
  /**
298
255
  * Platforms Code icon sizes (px):
@@ -303,17 +260,22 @@ declare const DGA_LOGICAL_ICON_NAMES: Set<DgaIconName>;
303
260
  */
304
261
  type DgaIconSize = '2xs' | 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl';
305
262
  type DgaIconTone = 'current' | 'primary' | 'muted' | 'success' | 'warning' | 'error';
263
+ /** Accept curated names plus app-registered custom names (keeps autocomplete for DgaIconName). */
264
+ type DgaIconNameInput = DgaIconName | (string & {});
306
265
  declare class DgaIcon {
307
266
  private readonly sanitizer;
308
267
  private readonly iconFont;
268
+ private readonly registry;
309
269
  /**
310
- * Curated inline SVG name for chrome / controls.
311
- * Required unless `glyph` is set.
270
+ * Curated HugeIcons (Stroke Rounded) / DGA SVG name for chrome / controls.
271
+ * Required unless `glyph` is set. App teams may pass names registered via
272
+ * {@link provideDgaIcons} / {@link DgaIconRegistry.register}.
312
273
  */
313
- readonly name: _angular_core.InputSignal<DgaIconName | undefined>;
274
+ readonly name: _angular_core.InputSignal<DgaIconNameInput | undefined>;
314
275
  /**
315
276
  * HugeIcons Stroke Rounded glyph id for content icons (e.g. `search-01`).
316
277
  * Requires `@import '@a.nemreen/dga-tokens/styles/icon-font.css'`.
278
+ * Prefer curated `name` for chrome controls so first paint does not wait on the font.
317
279
  */
318
280
  readonly glyph: _angular_core.InputSignal<string>;
319
281
  /** Default `sm` (16px) - common dense UI size; use `xl` (24px) for standard chrome. */
@@ -345,6 +307,57 @@ declare class DgaIconFontService {
345
307
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<DgaIconFontService>;
346
308
  }
347
309
 
310
+ /**
311
+ * Multi-provider bag of SVG markup keyed by icon name.
312
+ * Prefer {@link provideDgaIcons} at app bootstrap.
313
+ */
314
+ declare const DGA_ICON_OVERRIDES: InjectionToken<Readonly<Record<string, string>>[]>;
315
+ /**
316
+ * Register additional or overriding SVG icons for `<dga-icon name="…">`.
317
+ *
318
+ * @example
319
+ * ```ts
320
+ * bootstrapApplication(App, {
321
+ * providers: [
322
+ * provideDgaIcons({
323
+ * myBrand: `<svg …>…</svg>`,
324
+ * }),
325
+ * ],
326
+ * });
327
+ * ```
328
+ */
329
+ declare function provideDgaIcons(icons: Readonly<Record<string, string>>): EnvironmentProviders;
330
+
331
+ /**
332
+ * Resolves SVG markup for DgaIcon: runtime register → provideDgaIcons → HugeIcons/DGA catalog → core.
333
+ * Non-core catalog icons load once via a shared dynamic import (HugeIcons curated subset).
334
+ */
335
+ declare class DgaIconRegistry {
336
+ private readonly providerOverrides;
337
+ private readonly runtime;
338
+ private readonly defaults;
339
+ private readonly loading;
340
+ private readonly provided;
341
+ /** Synchronous lookup — empty until defaults finish loading for non-core names. */
342
+ get(name: string): string;
343
+ /** True when the name is in the first-paint core map. */
344
+ isCore(name: string): boolean;
345
+ /**
346
+ * Ensure the HugeIcons + DGA default catalog is loaded when `name` is not core / provided.
347
+ * Safe to call repeatedly; shares one import promise.
348
+ */
349
+ ensureLoaded(name: string): void;
350
+ /**
351
+ * Register or override an icon at runtime (e.g. after a lazy feature loads).
352
+ * Prefer {@link provideDgaIcons} for bootstrap-time icons.
353
+ */
354
+ register(name: string, svg: string): void;
355
+ /** Register many icons at once. */
356
+ registerAll(icons: Readonly<Record<string, string>>): void;
357
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaIconRegistry, never>;
358
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<DgaIconRegistry>;
359
+ }
360
+
348
361
  type DgaIconBadgeSize = 'sm' | 'md' | 'lg' | 'xl';
349
362
  type DgaIconBadgeAppearance = 'filled' | 'outline';
350
363
  /**
@@ -409,9 +422,9 @@ declare class DgaFormControl {
409
422
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
410
423
  readonly filled: _angular_core.InputSignalWithTransform<boolean, unknown>;
411
424
  /** Built-in leading icon (logical start). */
412
- readonly startIcon: _angular_core.InputSignal<DgaIconName | null>;
425
+ readonly startIcon: _angular_core.InputSignal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut" | null>;
413
426
  /** Built-in trailing icon (logical end). */
414
- readonly endIcon: _angular_core.InputSignal<DgaIconName | null>;
427
+ readonly endIcon: _angular_core.InputSignal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut" | null>;
415
428
  private readonly focused;
416
429
  private readonly typing;
417
430
  readonly classes: _angular_core.Signal<string>;
@@ -473,6 +486,18 @@ declare class DgaRadio {
473
486
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaRadio, "input[type=\"radio\"][dgaRadio]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "dgaInvalid"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
474
487
  }
475
488
 
489
+ type DgaChoiceLayout = 'column' | 'row';
490
+ /**
491
+ * Lays out checkbox or radio options in a column, a wrapping row, or a
492
+ * fixed column count. Narrow screens always fall back to one column.
493
+ */
494
+ declare class DgaChoiceGroup {
495
+ readonly layout: _angular_core.InputSignal<DgaChoiceLayout>;
496
+ readonly columns: _angular_core.InputSignalWithTransform<number | null, unknown>;
497
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaChoiceGroup, never>;
498
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaChoiceGroup, "[dgaChoiceGroup]", never, { "layout": { "alias": "layout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
499
+ }
500
+
476
501
  type DgaNativeSelectSize = DgaFormControlSize;
477
502
  /** Styles a native `<select dgaSelect>` — for simple forms without search/multi. */
478
503
  declare class DgaNativeSelect {
@@ -513,6 +538,12 @@ declare class DgaSelect implements ControlValueAccessor {
513
538
  readonly removeLabel: _angular_core.InputSignal<string>;
514
539
  readonly clearLabel: _angular_core.InputSignal<string>;
515
540
  readonly emptyLabel: _angular_core.InputSignal<string>;
541
+ /** Show a spinner row in the list (async / remote options). */
542
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
543
+ /** When searchable query matches no option, offer a “Create …” row. */
544
+ readonly creatable: _angular_core.InputSignalWithTransform<boolean, unknown>;
545
+ /** Prefix/label for the create row; `{q}` is replaced with the query. */
546
+ readonly createLabel: _angular_core.InputSignal<string>;
516
547
  readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
517
548
  private readonly cvaDisabled;
518
549
  readonly disabled: _angular_core.Signal<boolean>;
@@ -520,11 +551,16 @@ declare class DgaSelect implements ControlValueAccessor {
520
551
  readonly valueChange: _angular_core.OutputEmitterRef<string | string[]>;
521
552
  /** Emitted when the searchable query changes (remote lookup fields). */
522
553
  readonly searchChange: _angular_core.OutputEmitterRef<string>;
554
+ /** Emitted when the user picks the creatable “Create …” option. */
555
+ readonly create: _angular_core.OutputEmitterRef<string>;
523
556
  private onChange;
524
557
  private onTouched;
525
558
  readonly open: _angular_core.WritableSignal<boolean>;
526
559
  readonly query: _angular_core.WritableSignal<string>;
527
560
  readonly activeIndex: _angular_core.WritableSignal<number>;
561
+ private readonly uiLocale;
562
+ private readonly ar;
563
+ readonly loadingLabel: _angular_core.Signal<"جاري التحميل…" | "Loading…">;
528
564
  constructor();
529
565
  readonly resolvedStatus: _angular_core.Signal<DgaFormStatus>;
530
566
  readonly listVisible: _angular_core.Signal<boolean>;
@@ -539,6 +575,7 @@ declare class DgaSelect implements ControlValueAccessor {
539
575
  hasValue(): boolean;
540
576
  optionId(index: number): string;
541
577
  isSelected(v: string): boolean;
578
+ isCreateOption(opt: DgaSelectOption): boolean;
542
579
  selectedValues(): string[];
543
580
  toggleOpen(): void;
544
581
  onFocus(): void;
@@ -558,8 +595,100 @@ declare class DgaSelect implements ControlValueAccessor {
558
595
  private moveActive;
559
596
  private firstEnabledIndex;
560
597
  private lastEnabledIndex;
598
+ private withCreateOption;
599
+ private formatCreateLabel;
561
600
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSelect, never>;
562
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSelect, "dga-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "openMode": { "alias": "openMode"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "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; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "dgaInvalid"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "searchChange": "searchChange"; }, never, never, true, never>;
601
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSelect, "dga-select", never, { "options": { "alias": "options"; "required": false; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "openMode": { "alias": "openMode"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "status": { "alias": "status"; "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; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "creatable": { "alias": "creatable"; "required": false; "isSignal": true; }; "createLabel": { "alias": "createLabel"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "dgaInvalid"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "searchChange": "searchChange"; "create": "create"; }, never, never, true, never>;
602
+ }
603
+
604
+ interface DgaTreeItem {
605
+ id: string;
606
+ label: string;
607
+ children?: DgaTreeItem[];
608
+ disabled?: boolean;
609
+ }
610
+ /** Flatten tree in document order (parents before children). */
611
+ declare function dgaFlattenTree(items: DgaTreeItem[]): DgaTreeItem[];
612
+ /** Visible nodes given expanded ids (document order). */
613
+ declare function dgaVisibleTreeNodes(items: DgaTreeItem[], expandedIds: ReadonlySet<string> | readonly string[]): DgaTreeItem[];
614
+ /** Ancestors of `id` (nearest parent last), or empty if not found. */
615
+ declare function dgaTreeAncestors(items: DgaTreeItem[], id: string): DgaTreeItem[];
616
+ declare function dgaFindTreeItem(items: DgaTreeItem[], id: string): DgaTreeItem | null;
617
+ /** Filter tree: keep nodes matching query (and their ancestors). */
618
+ declare function dgaFilterTree(items: DgaTreeItem[], query: string): DgaTreeItem[];
619
+
620
+ type DgaTreeSelectSize = DgaFormControlSize;
621
+ /**
622
+ * Field trigger + popup tree. Single or multi; optional search filter; CVA.
623
+ *
624
+ * @example
625
+ * ```html
626
+ * <dga-tree-select
627
+ * [items]="org"
628
+ * [(value)]="selected"
629
+ * [searchable]="true"
630
+ * />
631
+ * ```
632
+ */
633
+ declare class DgaTreeSelect implements ControlValueAccessor {
634
+ private static nextId;
635
+ private readonly host;
636
+ readonly panelId: string;
637
+ readonly items: _angular_core.InputSignal<DgaTreeItem[]>;
638
+ /** Single: `string`. Multiple: `string[]`. */
639
+ readonly valueInput: _angular_core.InputSignal<string | string[]>;
640
+ readonly value: _angular_core.WritableSignal<string | string[]>;
641
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
642
+ readonly searchable: _angular_core.InputSignalWithTransform<boolean, unknown>;
643
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
644
+ readonly size: _angular_core.InputSignal<DgaFormControlSize>;
645
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
646
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
647
+ private readonly cvaDisabled;
648
+ readonly disabled: _angular_core.Signal<boolean>;
649
+ readonly label: _angular_core.InputSignal<string>;
650
+ readonly placeholderInput: _angular_core.InputSignal<string>;
651
+ readonly emptyLabelInput: _angular_core.InputSignal<string>;
652
+ /** When true, only leaf nodes can be selected. */
653
+ readonly onlyLeaves: _angular_core.InputSignalWithTransform<boolean, unknown>;
654
+ readonly open: _angular_core.ModelSignal<boolean>;
655
+ readonly expandedIds: _angular_core.ModelSignal<string[]>;
656
+ readonly query: _angular_core.WritableSignal<string>;
657
+ readonly valueChange: _angular_core.OutputEmitterRef<string | string[]>;
658
+ readonly selectedIdList: _angular_core.Signal<string[]>;
659
+ readonly filteredItems: _angular_core.Signal<DgaTreeItem[]>;
660
+ readonly selectedItems: _angular_core.Signal<DgaTreeItem[]>;
661
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
662
+ private onChange;
663
+ private onTouched;
664
+ constructor();
665
+ resolvedPlaceholder(): string;
666
+ searchPlaceholder(): string;
667
+ treeLabel(): string;
668
+ emptyLabel(): string;
669
+ removeLabel(): string;
670
+ clearLabel(): string;
671
+ hasValue(): boolean;
672
+ triggerWrapClasses(): string;
673
+ searchInputClasses(): string;
674
+ buttonClasses(): string;
675
+ onType(raw: string): void;
676
+ openPanel(): void;
677
+ toggleOpen(): void;
678
+ closePanel(): void;
679
+ onBlur(): void;
680
+ onDocClick(event: MouseEvent): void;
681
+ onTriggerKey(event: KeyboardEvent): void;
682
+ onTreeSelect(ids: string[]): void;
683
+ remove(id: string): void;
684
+ clear(): void;
685
+ private commit;
686
+ writeValue(value: string | string[]): void;
687
+ registerOnChange(fn: (value: string | string[]) => void): void;
688
+ registerOnTouched(fn: () => void): void;
689
+ setDisabledState(isDisabled: boolean): void;
690
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTreeSelect, never>;
691
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTreeSelect, "dga-tree-select", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "emptyLabelInput": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "onlyLeaves": { "alias": "onlyLeaves"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "expandedIds": { "alias": "expandedIds"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "expandedIds": "expandedIdsChange"; "valueChange": "valueChange"; }, never, never, true, never>;
563
692
  }
564
693
 
565
694
  /**
@@ -640,9 +769,16 @@ declare class DgaNumberInput implements ControlValueAccessor {
640
769
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaNumberInput, "dga-number-input", never, { "valueInput": { "alias": "value"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "stepSize": { "alias": "step"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "incrementLabel": { "alias": "incrementLabel"; "required": false; "isSignal": true; }; "decrementLabel": { "alias": "decrementLabel"; "required": false; "isSignal": true; }; "disabledInput": { "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>;
641
770
  }
642
771
 
772
+ type DgaSliderSize = 'sm' | 'md' | 'lg';
773
+ /**
774
+ * Styles a native range input: primary fill, neutral track, circular thumb.
775
+ * The fill length is a CSS variable updated from the current value.
776
+ */
643
777
  declare class DgaSlider {
644
- readonly size: _angular_core.InputSignal<"sm" | "md" | "lg">;
645
- readonly classes: _angular_core.Signal<string>;
778
+ private readonly el;
779
+ readonly size: _angular_core.InputSignal<DgaSliderSize>;
780
+ constructor();
781
+ paint(): void;
646
782
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSlider, never>;
647
783
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaSlider, "input[type=\"range\"][dgaSlider]", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
648
784
  }
@@ -714,6 +850,177 @@ declare class DgaChipInput implements ControlValueAccessor {
714
850
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaChipInput, "dga-chip-input", never, { "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; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "allowDuplicates": { "alias": "allowDuplicates"; "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
851
  }
716
852
 
853
+ /**
854
+ * Saudi IBAN helpers (ISO 13616).
855
+ * SA IBANs are 24 characters: `SA` + 2 check digits + 20 BBAN chars.
856
+ */
857
+ declare const DGA_IBAN_COUNTRY = "SA";
858
+ declare const DGA_IBAN_LENGTH = 24;
859
+ /** Strip spaces and force uppercase A–Z / 0–9. */
860
+ declare function dgaNormalizeIban(raw: string): string;
861
+ /** Format as groups of 4: `SA03 8000 0000 6080 1016 7519`. */
862
+ declare function dgaFormatIban(raw: string): string;
863
+ /**
864
+ * ISO 13616 mod-97 check.
865
+ * Move first 4 chars to the end, map A=10…Z=35, interpret as integer mod 97 === 1.
866
+ */
867
+ declare function dgaIsValidIban(raw: string): boolean;
868
+
869
+ /**
870
+ * Saudi IBAN field with grouping mask and ISO 13616 checksum.
871
+ * Always LTR so alphanumerics read left-to-right on RTL pages.
872
+ *
873
+ * @example
874
+ * ```html
875
+ * <dga-field label="IBAN">
876
+ * <dga-iban-input [(value)]="iban" />
877
+ * </dga-field>
878
+ * ```
879
+ */
880
+ declare class DgaIbanInput implements ControlValueAccessor {
881
+ /** Compact IBAN without spaces (`SA03…`). */
882
+ readonly value: _angular_core.ModelSignal<string>;
883
+ readonly controlId: _angular_core.InputSignal<string>;
884
+ readonly name: _angular_core.InputSignal<string>;
885
+ readonly label: _angular_core.InputSignal<string>;
886
+ readonly placeholder: _angular_core.InputSignal<string>;
887
+ /** Fixed country prefix shown before the editable remainder (default `SA`). */
888
+ readonly countryCode: _angular_core.InputSignal<string>;
889
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
890
+ private readonly cvaDisabled;
891
+ readonly disabled: _angular_core.Signal<boolean>;
892
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
893
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
894
+ readonly prefix: _angular_core.Signal<string>;
895
+ /** True when length is complete and mod-97 passes. */
896
+ readonly checksumValid: _angular_core.Signal<boolean>;
897
+ readonly displayValue: _angular_core.Signal<string>;
898
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
899
+ readonly groupClasses: _angular_core.Signal<string>;
900
+ private onChange;
901
+ onTouched: () => void;
902
+ onInput(raw: string): void;
903
+ writeValue(value: string): void;
904
+ registerOnChange(fn: (value: string) => void): void;
905
+ registerOnTouched(fn: () => void): void;
906
+ setDisabledState(isDisabled: boolean): void;
907
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaIbanInput, never>;
908
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaIbanInput, "dga-iban-input", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "countryCode": { "alias": "countryCode"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
909
+ }
910
+
911
+ /**
912
+ * Saudi National ID / Iqama helpers.
913
+ * 10 digits; starts with `1` (citizen) or `2` (resident); Luhn-style checksum.
914
+ */
915
+ type DgaNationalIdKind = 'citizen' | 'resident' | 'unknown';
916
+ declare function dgaNormalizeNationalId(raw: string): string;
917
+ declare function dgaNationalIdKind(id: string): DgaNationalIdKind;
918
+ /**
919
+ * Saudi ID checksum (even indices from the left are doubled; digits of product summed).
920
+ * Valid when the total sum is divisible by 10.
921
+ */
922
+ declare function dgaIsValidNationalId(raw: string): boolean;
923
+ /** Soft grouping for display: `1 234 567 890`. */
924
+ declare function dgaFormatNationalId(raw: string): string;
925
+
926
+ /**
927
+ * Saudi National ID / Iqama field (10 digits, checksum).
928
+ * Always LTR so digits read left-to-right on RTL pages.
929
+ *
930
+ * @example
931
+ * ```html
932
+ * <dga-field label="هوية وطنية">
933
+ * <dga-national-id [(value)]="id" />
934
+ * </dga-field>
935
+ * ```
936
+ */
937
+ declare class DgaNationalId implements ControlValueAccessor {
938
+ /** Compact 10-digit value. */
939
+ readonly value: _angular_core.ModelSignal<string>;
940
+ readonly controlId: _angular_core.InputSignal<string>;
941
+ readonly name: _angular_core.InputSignal<string>;
942
+ readonly label: _angular_core.InputSignal<string>;
943
+ readonly placeholder: _angular_core.InputSignal<string>;
944
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
945
+ private readonly cvaDisabled;
946
+ readonly disabled: _angular_core.Signal<boolean>;
947
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
948
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
949
+ readonly kind: _angular_core.Signal<DgaNationalIdKind>;
950
+ readonly checksumValid: _angular_core.Signal<boolean>;
951
+ readonly displayValue: _angular_core.Signal<string>;
952
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
953
+ readonly groupClasses: _angular_core.Signal<string>;
954
+ private onChange;
955
+ onTouched: () => void;
956
+ onInput(raw: string): void;
957
+ writeValue(value: string): void;
958
+ registerOnChange(fn: (value: string) => void): void;
959
+ registerOnTouched(fn: () => void): void;
960
+ setDisabledState(isDisabled: boolean): void;
961
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaNationalId, never>;
962
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaNationalId, "dga-national-id", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
963
+ }
964
+
965
+ type DgaPasswordStrength = 'empty' | 'weak' | 'fair' | 'good' | 'strong';
966
+ interface DgaPasswordStrengthResult {
967
+ level: DgaPasswordStrength;
968
+ /** 0–4 score used for the meter fill. */
969
+ score: number;
970
+ checks: {
971
+ length: boolean;
972
+ lower: boolean;
973
+ upper: boolean;
974
+ digit: boolean;
975
+ special: boolean;
976
+ };
977
+ }
978
+ /** Heuristic password strength (not a substitute for server-side policy). */
979
+ declare function dgaPasswordStrength(raw: string): DgaPasswordStrengthResult;
980
+
981
+ /**
982
+ * Password field with show/hide toggle and optional strength meter.
983
+ *
984
+ * @example
985
+ * ```html
986
+ * <dga-field label="كلمة المرور">
987
+ * <dga-password [(value)]="password" meter />
988
+ * </dga-field>
989
+ * ```
990
+ */
991
+ declare class DgaPassword implements ControlValueAccessor {
992
+ readonly meterSegments: number[];
993
+ readonly value: _angular_core.ModelSignal<string>;
994
+ readonly controlId: _angular_core.InputSignal<string>;
995
+ readonly name: _angular_core.InputSignal<string>;
996
+ readonly label: _angular_core.InputSignal<string>;
997
+ readonly placeholder: _angular_core.InputSignal<string>;
998
+ /** Show strength meter under the field. */
999
+ readonly meter: _angular_core.InputSignalWithTransform<boolean, unknown>;
1000
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1001
+ private readonly cvaDisabled;
1002
+ readonly disabled: _angular_core.Signal<boolean>;
1003
+ readonly required: _angular_core.InputSignalWithTransform<boolean, unknown>;
1004
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
1005
+ readonly revealed: _angular_core.WritableSignal<boolean>;
1006
+ readonly strength: _angular_core.Signal<DgaPasswordStrengthResult>;
1007
+ readonly meterId: _angular_core.Signal<string>;
1008
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
1009
+ readonly groupClasses: _angular_core.Signal<string>;
1010
+ private onChange;
1011
+ onTouched: () => void;
1012
+ toggleLabel(): string;
1013
+ strengthLabel(): string;
1014
+ toggleReveal(): void;
1015
+ onInput(raw: string): void;
1016
+ writeValue(value: string): void;
1017
+ registerOnChange(fn: (value: string) => void): void;
1018
+ registerOnTouched(fn: () => void): void;
1019
+ setDisabledState(isDisabled: boolean): void;
1020
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPassword, never>;
1021
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPassword, "dga-password", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "meter": { "alias": "meter"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1022
+ }
1023
+
717
1024
  interface DgaUploadFile {
718
1025
  id: string;
719
1026
  name: string;
@@ -849,10 +1156,20 @@ declare class DgaAutocomplete {
849
1156
  readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
850
1157
  readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
851
1158
  readonly status: _angular_core.InputSignal<DgaFormStatus>;
1159
+ /** Async options in flight — spinner in the list. */
1160
+ readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
1161
+ /** Offer a “Create …” row when the query matches no option. */
1162
+ readonly creatable: _angular_core.InputSignalWithTransform<boolean, unknown>;
1163
+ /** Create-row label; `{q}` is replaced with the query. */
1164
+ readonly createLabel: _angular_core.InputSignal<string>;
852
1165
  readonly valueChange: _angular_core.OutputEmitterRef<string>;
1166
+ /** Emitted when the search query changes (remote lookup). */
1167
+ readonly search: _angular_core.OutputEmitterRef<string>;
1168
+ /** Emitted when the user picks the creatable option. */
1169
+ readonly create: _angular_core.OutputEmitterRef<string>;
853
1170
  onValueChange(next: string | string[]): void;
854
1171
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAutocomplete, never>;
855
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAutocomplete, "dga-autocomplete", 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; }; "size": { "alias": "size"; "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>;
1172
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaAutocomplete, "dga-autocomplete", 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; }; "size": { "alias": "size"; "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; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "creatable": { "alias": "creatable"; "required": false; "isSignal": true; }; "createLabel": { "alias": "createLabel"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; "search": "search"; "create": "create"; }, never, never, true, never>;
856
1173
  }
857
1174
 
858
1175
  /** @deprecated Prefer `DgaSelectOption` — alias kept for existing imports. */
@@ -919,6 +1236,94 @@ declare class DgaTimePicker {
919
1236
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTimePicker, "dga-time-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "hourLabel": { "alias": "hourLabel"; "required": false; "isSignal": true; }; "minuteLabel": { "alias": "minuteLabel"; "required": false; "isSignal": true; }; "periodLabel": { "alias": "periodLabel"; "required": false; "isSignal": true; }; "amLabel": { "alias": "amLabel"; "required": false; "isSignal": true; }; "pmLabel": { "alias": "pmLabel"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "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; }; }, { "value": "valueChange"; }, never, never, true, never>;
920
1237
  }
921
1238
 
1239
+ /**
1240
+ * Canvas signature pad for Saudi e-services.
1241
+ *
1242
+ * @example
1243
+ * ```html
1244
+ * <dga-signature-pad [(value)]="sig" label="التوقيع" />
1245
+ * ```
1246
+ */
1247
+ declare class DgaSignaturePad implements ControlValueAccessor {
1248
+ private readonly canvasRef;
1249
+ private readonly host;
1250
+ readonly width: _angular_core.InputSignal<number>;
1251
+ readonly height: _angular_core.InputSignal<number>;
1252
+ readonly penColor: _angular_core.InputSignal<string>;
1253
+ readonly lineWidth: _angular_core.InputSignal<number>;
1254
+ readonly label: _angular_core.InputSignal<string>;
1255
+ readonly clearLabel: _angular_core.InputSignal<string>;
1256
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
1257
+ private readonly cvaDisabled;
1258
+ readonly disabled: _angular_core.Signal<boolean>;
1259
+ /** PNG data URL. */
1260
+ readonly value: _angular_core.ModelSignal<string>;
1261
+ private readonly uiLocale;
1262
+ private readonly ar;
1263
+ readonly hintText: _angular_core.Signal<"وقّع هنا" | "Sign here">;
1264
+ readonly drawing: _angular_core.WritableSignal<boolean>;
1265
+ private readonly stroked;
1266
+ private lastX;
1267
+ private lastY;
1268
+ /** Skip restoring from `value` while we own the canvas. */
1269
+ private localWrite;
1270
+ private onChange;
1271
+ private onTouched;
1272
+ constructor();
1273
+ readonly wrapClasses: _angular_core.Signal<string>;
1274
+ isEmpty(): boolean;
1275
+ clear(): void;
1276
+ onPointerDown(event: PointerEvent): void;
1277
+ onPointerMove(event: PointerEvent): void;
1278
+ onPointerUp(event: PointerEvent): void;
1279
+ onPointerLeave(event: PointerEvent): void;
1280
+ writeValue(value: string): void;
1281
+ registerOnChange(fn: (value: string) => void): void;
1282
+ registerOnTouched(fn: () => void): void;
1283
+ setDisabledState(isDisabled: boolean): void;
1284
+ private emitStroke;
1285
+ private commit;
1286
+ private resetCanvasSurface;
1287
+ private coords;
1288
+ private resolvePenColor;
1289
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSignaturePad, never>;
1290
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSignaturePad, "dga-signature-pad", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "penColor": { "alias": "penColor"; "required": false; "isSignal": true; }; "lineWidth": { "alias": "lineWidth"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1291
+ }
1292
+
1293
+ type DgaRichTextCmd = 'bold' | 'italic' | 'underline' | 'insertUnorderedList' | 'insertOrderedList';
1294
+ /**
1295
+ * Lightweight contenteditable rich-text field (bold / italic / underline / lists).
1296
+ */
1297
+ declare class DgaRichText {
1298
+ private readonly editorRef;
1299
+ readonly value: _angular_core.ModelSignal<string>;
1300
+ readonly placeholder: _angular_core.InputSignal<string>;
1301
+ readonly label: _angular_core.InputSignal<string>;
1302
+ readonly minHeight: _angular_core.InputSignal<number>;
1303
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1304
+ private readonly uiLocale;
1305
+ private readonly ar;
1306
+ private readonly syncing;
1307
+ private readonly activeCmds;
1308
+ readonly toolbarLabel: _angular_core.Signal<"شريط التنسيق" | "Formatting toolbar">;
1309
+ readonly labels: _angular_core.Signal<{
1310
+ bold: string;
1311
+ italic: string;
1312
+ underline: string;
1313
+ ul: string;
1314
+ ol: string;
1315
+ }>;
1316
+ constructor();
1317
+ isActive(cmd: DgaRichTextCmd): boolean;
1318
+ exec(cmd: DgaRichTextCmd): void;
1319
+ onInput(): void;
1320
+ onBlur(): void;
1321
+ refreshActive(): void;
1322
+ private emitFromEditor;
1323
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaRichText, never>;
1324
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaRichText, "dga-rich-text", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "minHeight": { "alias": "minHeight"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; }, never, never, true, never>;
1325
+ }
1326
+
922
1327
  type DgaDialogSize = 'sm' | 'md' | 'lg';
923
1328
  declare class DgaDialog {
924
1329
  private readonly injector;
@@ -947,6 +1352,46 @@ declare class DgaDialog {
947
1352
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaDialog, "dga-dialog", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[dgaDialogActions]"], true, never>;
948
1353
  }
949
1354
 
1355
+ type DgaConfirmTone = 'default' | 'danger';
1356
+ /**
1357
+ * Standardized confirm dialog preset (cancel + confirm). Use `tone="danger"` for
1358
+ * destructive deletes.
1359
+ *
1360
+ * @example
1361
+ * ```html
1362
+ * <dga-confirm
1363
+ * [(open)]="open"
1364
+ * tone="danger"
1365
+ * title="حذف الطلب؟"
1366
+ * message="لا يمكن التراجع عن هذا الإجراء."
1367
+ * (confirmed)="onDelete()"
1368
+ * />
1369
+ * ```
1370
+ */
1371
+ declare class DgaConfirm {
1372
+ readonly open: _angular_core.ModelSignal<boolean>;
1373
+ readonly title: _angular_core.InputSignal<string>;
1374
+ readonly message: _angular_core.InputSignal<string>;
1375
+ readonly size: _angular_core.InputSignal<DgaDialogSize>;
1376
+ readonly tone: _angular_core.InputSignal<DgaConfirmTone>;
1377
+ readonly confirmLabel: _angular_core.InputSignal<string>;
1378
+ readonly cancelLabel: _angular_core.InputSignal<string>;
1379
+ readonly closeLabel: _angular_core.InputSignal<string>;
1380
+ readonly closeOnBackdrop: _angular_core.InputSignalWithTransform<boolean, unknown>;
1381
+ readonly confirmed: _angular_core.OutputEmitterRef<void>;
1382
+ readonly cancelled: _angular_core.OutputEmitterRef<void>;
1383
+ readonly confirmVariant: _angular_core.Signal<"primary" | "danger">;
1384
+ defaultCloseLabel(): string;
1385
+ defaultCancelLabel(): string;
1386
+ defaultConfirmLabel(): string;
1387
+ confirm(): void;
1388
+ cancel(): void;
1389
+ /** Escape / backdrop / X — `closed` only fires from those paths on `dga-dialog`. */
1390
+ onDialogClosed(): void;
1391
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaConfirm, never>;
1392
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaConfirm, "dga-confirm", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "confirmed": "confirmed"; "cancelled": "cancelled"; }, never, ["*"], true, never>;
1393
+ }
1394
+
950
1395
  type DgaModalSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
951
1396
  type DgaModalAnimation = 'fade' | 'scale' | 'slide' | 'none';
952
1397
  declare class DgaModal {
@@ -1053,7 +1498,7 @@ declare class DgaToast implements OnDestroy {
1053
1498
  /** Clear sticky announcement / reserved chrome, then a small gap. */
1054
1499
  readonly edgeTop: _angular_core.Signal<"calc(var(--dga-announcement-offset, 0px) + 1rem)" | null>;
1055
1500
  readonly edgeBottom: _angular_core.Signal<"1rem" | null>;
1056
- readonly iconName: _angular_core.Signal<DgaIconName>;
1501
+ readonly iconName: _angular_core.Signal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut">;
1057
1502
  readonly iconTone: _angular_core.Signal<"success" | "warning" | "error" | "muted" | "current">;
1058
1503
  readonly showCountdown: _angular_core.Signal<boolean>;
1059
1504
  readonly reduceMotion: _angular_core.WritableSignal<boolean>;
@@ -1231,8 +1676,13 @@ declare class DgaMenu {
1231
1676
  readonly open: _angular_core.ModelSignal<boolean>;
1232
1677
  readonly triggerLabel: _angular_core.InputSignal<string>;
1233
1678
  /** Optional leading glyph (e.g. share on page heroes). */
1234
- readonly leadingIcon: _angular_core.InputSignal<DgaIconName | null>;
1679
+ readonly leadingIcon: _angular_core.InputSignal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut" | null>;
1235
1680
  readonly showChevron: _angular_core.InputSignalWithTransform<boolean, unknown>;
1681
+ /**
1682
+ * `default` = bordered labeled trigger.
1683
+ * `icon` = compact ghost icon button (table row actions).
1684
+ */
1685
+ readonly appearance: _angular_core.InputSignal<"default" | "icon">;
1236
1686
  /** Minimum panel width (e.g. share menus). */
1237
1687
  readonly menuMinWidth: _angular_core.InputSignal<string>;
1238
1688
  /** Emits the full selected item. */
@@ -1272,7 +1722,7 @@ declare class DgaMenu {
1272
1722
  private cssLengthToPx;
1273
1723
  private focusItem;
1274
1724
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaMenu, never>;
1275
- 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>;
1725
+ 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; }; "appearance": { "alias": "appearance"; "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>;
1276
1726
  }
1277
1727
 
1278
1728
  type DgaContextMenuItemType = 'item' | 'checkbox' | 'radio' | 'divider' | 'label';
@@ -1493,6 +1943,99 @@ declare class DgaDrawer {
1493
1943
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaDrawer, "dga-drawer", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "side": { "alias": "side"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[dgaDrawerActions]"], true, never>;
1494
1944
  }
1495
1945
 
1946
+ type DgaBottomSheetSnap = 'peek' | 'half' | 'full';
1947
+ declare class DgaBottomSheet {
1948
+ private readonly doc;
1949
+ private readonly destroyRef;
1950
+ private readonly injector;
1951
+ private readonly rootRef;
1952
+ private readonly panel;
1953
+ readonly open: _angular_core.ModelSignal<boolean>;
1954
+ readonly title: _angular_core.InputSignal<string>;
1955
+ /** Controls max-height: peek 40%, half 60%, full 85%. */
1956
+ readonly snap: _angular_core.InputSignal<DgaBottomSheetSnap>;
1957
+ readonly closeLabel: _angular_core.InputSignal<string>;
1958
+ readonly closeOnBackdrop: _angular_core.InputSignalWithTransform<boolean, unknown>;
1959
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1960
+ readonly titleId: string;
1961
+ readonly dragging: _angular_core.WritableSignal<boolean>;
1962
+ private readonly dragY;
1963
+ private dragPointerId;
1964
+ private dragStartY;
1965
+ private previousFocus;
1966
+ private previousBodyOverflow;
1967
+ private previousHtmlOverflow;
1968
+ private scrollLocked;
1969
+ readonly maxHeight: _angular_core.Signal<string>;
1970
+ readonly panelTransform: _angular_core.Signal<string | null>;
1971
+ readonly panelClasses: _angular_core.Signal<string>;
1972
+ constructor();
1973
+ close(): void;
1974
+ onBackdrop(): void;
1975
+ onKeydown(event: KeyboardEvent): void;
1976
+ onHandlePointerDown(event: PointerEvent): void;
1977
+ onHandlePointerMove(event: PointerEvent): void;
1978
+ onHandlePointerUp(event: PointerEvent): void;
1979
+ private resetDrag;
1980
+ private portalToBody;
1981
+ private removePortaledRoot;
1982
+ private focusInitial;
1983
+ private trapFocus;
1984
+ private getFocusable;
1985
+ private lockScroll;
1986
+ private unlockScroll;
1987
+ private restoreFocus;
1988
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaBottomSheet, never>;
1989
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaBottomSheet, "dga-bottom-sheet", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "snap": { "alias": "snap"; "required": false; "isSignal": true; }; "closeLabel": { "alias": "closeLabel"; "required": false; "isSignal": true; }; "closeOnBackdrop": { "alias": "closeOnBackdrop"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; }, never, ["*", "[dgaBottomSheetActions]"], true, never>;
1990
+ }
1991
+
1992
+ /** Matches tooltip placements (logical start/end for RTL). */
1993
+ type DgaPopoverPlacement = 'top' | 'bottom' | 'start' | 'end';
1994
+ /**
1995
+ * Anchored popover: default slot = trigger; project the panel with `[dgaPopoverPanel]`.
1996
+ *
1997
+ * @example
1998
+ * ```html
1999
+ * <dga-popover [(open)]="open" placement="bottom">
2000
+ * <button type="button">فتح</button>
2001
+ * <div dgaPopoverPanel class="p-xl">محتوى اللوحة</div>
2002
+ * </dga-popover>
2003
+ * ```
2004
+ */
2005
+ declare class DgaPopover {
2006
+ private readonly host;
2007
+ private readonly destroyRef;
2008
+ private readonly injector;
2009
+ private readonly triggerRef;
2010
+ private readonly panelRef;
2011
+ readonly open: _angular_core.ModelSignal<boolean>;
2012
+ readonly placement: _angular_core.InputSignal<DgaPopoverPlacement>;
2013
+ readonly closeOnOutside: _angular_core.InputSignalWithTransform<boolean, unknown>;
2014
+ readonly opened: _angular_core.OutputEmitterRef<void>;
2015
+ readonly closed: _angular_core.OutputEmitterRef<void>;
2016
+ readonly panelStyle: _angular_core.WritableSignal<Record<string, string>>;
2017
+ private readonly seq;
2018
+ readonly triggerId: string;
2019
+ readonly panelId: string;
2020
+ private readonly onReposition;
2021
+ constructor();
2022
+ panelClasses(): string;
2023
+ onTriggerClick(event: MouseEvent): void;
2024
+ onTriggerKey(event: KeyboardEvent): void;
2025
+ onPanelKey(event: KeyboardEvent): void;
2026
+ toggle(): void;
2027
+ openPanel(): void;
2028
+ close(restoreFocus?: boolean): void;
2029
+ onDocumentPointer(event: PointerEvent): void;
2030
+ onDocumentKeydown(event: KeyboardEvent): void;
2031
+ private portalPanelToBody;
2032
+ private detachPortaledPanel;
2033
+ private focusPanel;
2034
+ private syncPanelPosition;
2035
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPopover, never>;
2036
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPopover, "dga-popover", never, { "open": { "alias": "open"; "required": false; "isSignal": true; }; "placement": { "alias": "placement"; "required": false; "isSignal": true; }; "closeOnOutside": { "alias": "closeOnOutside"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "opened": "opened"; "closed": "closed"; }, never, ["*", "[dgaPopoverPanel]"], true, never>;
2037
+ }
2038
+
1496
2039
  interface DgaImagePopupImage {
1497
2040
  src: string;
1498
2041
  alt?: string;
@@ -1504,8 +2047,12 @@ type DgaImagePopupAnimation = 'fade' | 'scale' | 'slide' | 'zoom' | 'none';
1504
2047
  /** Cross-fade when changing the active image. */
1505
2048
  type DgaImagePopupImageTransition = 'fade' | 'none';
1506
2049
  declare class DgaImagePopup {
2050
+ private readonly doc;
1507
2051
  private readonly injector;
2052
+ private readonly host;
1508
2053
  private readonly panel;
2054
+ /** Marks the in-page slot while the host is moved to `document.body`. */
2055
+ private anchor;
1509
2056
  readonly images: _angular_core.InputSignal<DgaImagePopupSource[]>;
1510
2057
  readonly open: _angular_core.ModelSignal<boolean>;
1511
2058
  readonly activeIndex: _angular_core.ModelSignal<number>;
@@ -1548,6 +2095,9 @@ declare class DgaImagePopup {
1548
2095
  onKeydown(event: KeyboardEvent): void;
1549
2096
  onAnimationEnd(event: AnimationEvent): void;
1550
2097
  private finishClose;
2098
+ /** Lift the host out of ancestor stacking contexts (docs header / sidebar). */
2099
+ private portalHostToBody;
2100
+ private restoreHost;
1551
2101
  private focusInitial;
1552
2102
  private trapFocus;
1553
2103
  private getFocusable;
@@ -1558,6 +2108,63 @@ declare class DgaImagePopup {
1558
2108
  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>;
1559
2109
  }
1560
2110
 
2111
+ type DgaFilePreviewKind = 'image' | 'pdf' | 'unknown';
2112
+ /** Infer preview kind from MIME type and/or file name / URL path. */
2113
+ declare function dgaDetectFilePreviewKind(src: string, opts?: {
2114
+ fileName?: string;
2115
+ mimeType?: string;
2116
+ }): DgaFilePreviewKind;
2117
+
2118
+ type DgaFilePreviewPresentation = 'inline' | 'dialog' | 'drawer';
2119
+ /**
2120
+ * File preview for images and PDFs. Use `presentation="dialog"|"drawer"` with
2121
+ * `[(open)]` for overlay mode, or `inline` for embedded preview.
2122
+ *
2123
+ * @example
2124
+ * ```html
2125
+ * <dga-file-preview
2126
+ * [(open)]="open"
2127
+ * presentation="dialog"
2128
+ * [src]="url"
2129
+ * fileName="receipt.pdf"
2130
+ * />
2131
+ * ```
2132
+ */
2133
+ declare class DgaFilePreview {
2134
+ private readonly sanitizer;
2135
+ /** Object URL, remote URL, or data URL to preview. */
2136
+ readonly src: _angular_core.InputSignal<string>;
2137
+ /** Force kind, or `auto` to detect from name/MIME/URL. */
2138
+ readonly type: _angular_core.InputSignal<"auto" | DgaFilePreviewKind>;
2139
+ readonly fileName: _angular_core.InputSignal<string>;
2140
+ readonly mimeType: _angular_core.InputSignal<string>;
2141
+ readonly alt: _angular_core.InputSignal<string>;
2142
+ readonly title: _angular_core.InputSignal<string>;
2143
+ readonly presentation: _angular_core.InputSignal<DgaFilePreviewPresentation>;
2144
+ /** Overlay open state (dialog / drawer). */
2145
+ readonly open: _angular_core.ModelSignal<boolean>;
2146
+ readonly dialogSize: _angular_core.InputSignal<DgaDialogSize>;
2147
+ readonly drawerSide: _angular_core.InputSignal<DgaDrawerSide>;
2148
+ readonly showDownload: _angular_core.InputSignalWithTransform<boolean, unknown>;
2149
+ readonly downloadName: _angular_core.InputSignal<string>;
2150
+ readonly closeLabelInput: _angular_core.InputSignal<string>;
2151
+ readonly closed: _angular_core.OutputEmitterRef<void>;
2152
+ readonly downloaded: _angular_core.OutputEmitterRef<string>;
2153
+ readonly resolvedKind: _angular_core.Signal<DgaFilePreviewKind>;
2154
+ readonly safePdfSrc: _angular_core.Signal<SafeResourceUrl | null>;
2155
+ resolvedFileName(): string;
2156
+ resolvedTitle(): string;
2157
+ resolvedAlt(): string;
2158
+ closeLabel(): string;
2159
+ downloadLabel(): string;
2160
+ unknownTitle(): string;
2161
+ bodyClasses(): string;
2162
+ hostInlineClasses(): string;
2163
+ onDownload(): void;
2164
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaFilePreview, never>;
2165
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaFilePreview, "dga-file-preview", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "fileName": { "alias": "fileName"; "required": false; "isSignal": true; }; "mimeType": { "alias": "mimeType"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "presentation": { "alias": "presentation"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "dialogSize": { "alias": "dialogSize"; "required": false; "isSignal": true; }; "drawerSide": { "alias": "drawerSide"; "required": false; "isSignal": true; }; "showDownload": { "alias": "showDownload"; "required": false; "isSignal": true; }; "downloadName": { "alias": "downloadName"; "required": false; "isSignal": true; }; "closeLabelInput": { "alias": "closeLabel"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "closed": "closed"; "downloaded": "downloaded"; }, never, never, true, never>;
2166
+ }
2167
+
1561
2168
  /** Logical placements (RTL-aware via inset-inline). */
1562
2169
  type DgaTourPlacement = 'top' | 'bottom' | 'start' | 'end' | 'auto';
1563
2170
  type DgaTourPersist = 'local' | 'session' | 'none';
@@ -1686,7 +2293,7 @@ declare class DgaAlert {
1686
2293
  readonly textClasses: _angular_core.Signal<"flex flex-col gap-xs" | "min-w-0">;
1687
2294
  readonly titleClasses: _angular_core.Signal<string>;
1688
2295
  readonly descriptionClasses: _angular_core.Signal<string>;
1689
- readonly iconName: _angular_core.Signal<DgaIconName>;
2296
+ readonly iconName: _angular_core.Signal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut">;
1690
2297
  readonly iconTone: _angular_core.Signal<"success" | "warning" | "error" | "muted" | "current">;
1691
2298
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaAlert, never>;
1692
2299
  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>;
@@ -1916,116 +2523,134 @@ declare class DgaShare {
1916
2523
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaShare, "dga-share", never, { "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "url": { "alias": "url"; "required": false; "isSignal": true; }; "shareTitle": { "alias": "shareTitle"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; "iconOnly": { "alias": "iconOnly"; "required": false; "isSignal": true; }; "buttonVariant": { "alias": "buttonVariant"; "required": false; "isSignal": true; }; "buttonSize": { "alias": "buttonSize"; "required": false; "isSignal": true; }; }, { "shared": "shared"; "linkCopied": "linkCopied"; }, never, never, true, never>;
1917
2524
  }
1918
2525
 
1919
- type DgaChatbotPosition = 'end' | 'start' | 'left' | 'right';
1920
- type DgaChatbotAnimation = 'fade' | 'slide' | 'scale' | 'none';
1921
- type DgaChatbotSize = 'sm' | 'md' | 'lg';
1922
- type DgaChatbotFabTone = 'primary' | 'secondary';
1923
- interface DgaChatbotMessage {
1924
- id: string;
1925
- role: 'bot' | 'user';
1926
- text: string;
2526
+ /**
2527
+ * Print-ready region: wraps ticket/receipt content, hides page chrome on print,
2528
+ * and triggers `window.print()`. Pair with `dga-qr` / `dga-barcode`.
2529
+ *
2530
+ * Mark non-printable chrome inside the region with class `dga-print-hide`
2531
+ * (or put the trigger outside and call `print()`).
2532
+ *
2533
+ * @example
2534
+ * ```html
2535
+ * <dga-print documentTitle="Ticket #42">
2536
+ * <dga-qr value="…" />
2537
+ * <dga-barcode value="TKT-42" />
2538
+ * </dga-print>
2539
+ * ```
2540
+ */
2541
+ declare class DgaPrint {
2542
+ private readonly host;
2543
+ private readonly destroyRef;
2544
+ /** Document title while the print dialog is open. */
2545
+ readonly documentTitle: _angular_core.InputSignal<string>;
2546
+ /** `@page` margin token (CSS length). */
2547
+ readonly margin: _angular_core.InputSignal<string>;
2548
+ /** Show the built-in print button. */
2549
+ readonly showTrigger: _angular_core.InputSignalWithTransform<boolean, unknown>;
2550
+ /** Override trigger label (defaults to Print / طباعة). */
2551
+ readonly triggerLabel: _angular_core.InputSignal<string>;
2552
+ readonly beforePrint: _angular_core.OutputEmitterRef<void>;
2553
+ readonly afterPrint: _angular_core.OutputEmitterRef<void>;
2554
+ private readonly onAfterPrint;
2555
+ private previousTitle;
2556
+ private printing;
2557
+ private fallbackTimer;
2558
+ constructor();
2559
+ hostClasses(): string;
2560
+ resolvedTriggerLabel(): string;
2561
+ /** Open the browser print dialog for this region. */
2562
+ print(): void;
2563
+ private cleanup;
2564
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPrint, never>;
2565
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaPrint, "dga-print", never, { "documentTitle": { "alias": "documentTitle"; "required": false; "isSignal": true; }; "margin": { "alias": "margin"; "required": false; "isSignal": true; }; "showTrigger": { "alias": "showTrigger"; "required": false; "isSignal": true; }; "triggerLabel": { "alias": "triggerLabel"; "required": false; "isSignal": true; }; }, { "beforePrint": "beforePrint"; "afterPrint": "afterPrint"; }, never, ["*"], true, never>;
1927
2566
  }
2567
+
2568
+ type DgaOfflineMode = 'offline' | 'online' | 'both';
1928
2569
  /**
1929
- * Floating live-chat launcher + panel. Place once near the app root
1930
- * (beside `dga-scroll-top` / `dga-accessibility`).
2570
+ * Connection status banner for field apps. Listens to `online` / `offline`
2571
+ * events; override with `forceOffline` in demos.
2572
+ *
2573
+ * Distinct from site-wide `dga-announcement-bar` — this is a page/app status strip.
1931
2574
  *
1932
- * Use `stack` so FABs share one vertical dock:
1933
- * a11y `0` → chatbot `1` → scroll-top `2`.
2575
+ * @example
2576
+ * ```html
2577
+ * <dga-offline sticky />
2578
+ * ```
1934
2579
  */
1935
- declare class DgaChatbot {
2580
+ declare class DgaOffline {
1936
2581
  private readonly destroyRef;
1937
- private readonly injector;
1938
- private readonly composerRef;
1939
- private readonly logRef;
1940
- /** Corner for FAB + panel. `end` / `start` follow reading direction. */
1941
- readonly position: _angular_core.InputSignal<DgaChatbotPosition>;
1942
- /** Panel enter animation. Honors `prefers-reduced-motion`. */
1943
- readonly animation: _angular_core.InputSignal<DgaChatbotAnimation>;
1944
- readonly size: _angular_core.InputSignal<DgaChatbotSize>;
1945
- readonly title: _angular_core.InputSignal<string>;
1946
- readonly subtitle: _angular_core.InputSignal<string>;
1947
- readonly fabLabel: _angular_core.InputSignal<string>;
1948
- readonly placeholder: _angular_core.InputSignal<string>;
1949
- readonly fabIcon: _angular_core.InputSignal<DgaIconName>;
1950
- /** Prefer a directional arrow so send ≠ chat bubble. */
1951
- readonly sendIcon: _angular_core.InputSignal<DgaIconName>;
1952
- readonly agentIcon: _angular_core.InputSignal<DgaIconName>;
1953
- readonly fabTone: _angular_core.InputSignal<DgaChatbotFabTone>;
1954
- /** Dim page behind the panel. */
1955
- readonly overlay: _angular_core.InputSignalWithTransform<boolean, unknown>;
1956
- /** Close when clicking the overlay. */
1957
- readonly overlayClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
1958
- /** Green online dot on the agent avatar. */
1959
- readonly online: _angular_core.InputSignalWithTransform<boolean, unknown>;
1960
- /** Hide launcher while the panel is open (recommended). */
1961
- readonly hideFabWhenOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
1962
- /**
1963
- * 0-based slot in the shared FAB dock (bottom → top).
1964
- * Typical: a11y=0, chatbot=1, scroll-top=2.
1965
- */
1966
- readonly stack: _angular_core.InputSignalWithTransform<number, unknown>;
1967
- /**
1968
- * @deprecated Prefer `stack`. When true and `stack` is unset legacy path —
1969
- * kept for callers; `stack` wins.
1970
- */
1971
- readonly clearFab: _angular_core.InputSignalWithTransform<boolean, unknown>;
1972
- /**
1973
- * Anchor FAB/panel inside a relative parent (gallery / docs preview)
1974
- * instead of the viewport — avoids a second global FAB.
1975
- */
1976
- readonly embedded: _angular_core.InputSignalWithTransform<boolean, unknown>;
1977
- readonly initialMessages: _angular_core.InputSignal<readonly DgaChatbotMessage[]>;
1978
- readonly sent: _angular_core.OutputEmitterRef<string>;
1979
- readonly opened: _angular_core.OutputEmitterRef<void>;
1980
- readonly closed: _angular_core.OutputEmitterRef<void>;
1981
- readonly open: _angular_core.WritableSignal<boolean>;
1982
- readonly draft: _angular_core.WritableSignal<string>;
1983
- readonly messages: _angular_core.WritableSignal<DgaChatbotMessage[]>;
1984
- private readonly seq;
1985
- readonly panelId: string;
1986
- private msgSeq;
1987
- private seeded;
1988
- private prevOverflow;
1989
- readonly copy: _angular_core.Signal<{
1990
- title: string;
1991
- subtitle: string;
1992
- open: string;
1993
- close: string;
1994
- send: string;
1995
- input: string;
1996
- placeholder: string;
1997
- panelLabel: string;
1998
- welcome: string;
1999
- }>;
2000
- readonly fabBottom: _angular_core.Signal<string>;
2001
- readonly fabClasses: _angular_core.Signal<string>;
2002
- readonly panelClasses: _angular_core.Signal<string>;
2582
+ /** Show when offline, when back online, or both. */
2583
+ readonly mode: _angular_core.InputSignal<DgaOfflineMode>;
2584
+ /** Sticky top strip (uses `--z-index-banner`). */
2585
+ readonly sticky: _angular_core.InputSignalWithTransform<boolean, unknown>;
2586
+ /** Allow dismissing the current state until connectivity changes. */
2587
+ readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
2588
+ readonly dismissLabel: _angular_core.InputSignal<string>;
2589
+ /** Override offline copy. */
2590
+ readonly offlineMessage: _angular_core.InputSignal<string>;
2591
+ /** Override online recovery copy. */
2592
+ readonly onlineMessage: _angular_core.InputSignal<string>;
2593
+ /** Demo / test override — when set, ignores navigator.onLine. */
2594
+ readonly forceOffline: _angular_core.InputSignal<boolean | null>;
2595
+ readonly onlineChange: _angular_core.OutputEmitterRef<boolean>;
2596
+ readonly dismissed: _angular_core.OutputEmitterRef<void>;
2597
+ private readonly navigatorOnline;
2598
+ private readonly dismissedState;
2599
+ readonly isOffline: _angular_core.Signal<boolean>;
2600
+ readonly visible: _angular_core.Signal<boolean>;
2601
+ readonly barClasses: _angular_core.Signal<string>;
2003
2602
  constructor();
2004
- private ensureSeed;
2005
- toggle(): void;
2006
- show(): void;
2007
- close(): void;
2008
- onBackdrop(): void;
2009
- onSubmit(event: Event): void;
2010
- private scrollLogToEnd;
2011
- private lockScroll;
2012
- private unlockScroll;
2013
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaChatbot, never>;
2014
- 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>;
2603
+ resolvedMessage(): string;
2604
+ defaultDismissLabel(): string;
2605
+ dismiss(): void;
2606
+ private setOnline;
2607
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaOffline, never>;
2608
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaOffline, "dga-offline", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "sticky": { "alias": "sticky"; "required": false; "isSignal": true; }; "dismissible": { "alias": "dismissible"; "required": false; "isSignal": true; }; "dismissLabel": { "alias": "dismissLabel"; "required": false; "isSignal": true; }; "offlineMessage": { "alias": "offlineMessage"; "required": false; "isSignal": true; }; "onlineMessage": { "alias": "onlineMessage"; "required": false; "isSignal": true; }; "forceOffline": { "alias": "forceOffline"; "required": false; "isSignal": true; }; }, { "onlineChange": "onlineChange"; "dismissed": "dismissed"; }, never, never, true, never>;
2015
2609
  }
2016
2610
 
2017
2611
  /**
2018
2612
  * Visually hidden until focused — first tab stop for keyboard users.
2019
2613
  * Place near the top of the document; `href` should target main content id.
2020
2614
  */
2021
- declare class DgaSkipLink {
2615
+ declare class DgaSkipLink {
2616
+ private readonly uiLocale;
2617
+ readonly href: _angular_core.InputSignal<string>;
2618
+ readonly label: _angular_core.InputSignal<string | undefined>;
2619
+ readonly resolvedLabel: _angular_core.Signal<string>;
2620
+ safeHref(href: string | undefined | null): string;
2621
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSkipLink, never>;
2622
+ 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>;
2623
+ }
2624
+
2625
+ interface DgaNotificationItem {
2626
+ id: string;
2627
+ title: string;
2628
+ body?: string;
2629
+ time?: string;
2630
+ read?: boolean;
2631
+ href?: string;
2632
+ }
2633
+ /**
2634
+ * Page-level notification inbox (distinct from header overlay config).
2635
+ */
2636
+ declare class DgaNotificationInbox {
2022
2637
  private readonly uiLocale;
2023
- readonly href: _angular_core.InputSignal<string>;
2024
- readonly label: _angular_core.InputSignal<string | undefined>;
2025
- readonly resolvedLabel: _angular_core.Signal<string>;
2026
- safeHref(href: string | undefined | null): string;
2027
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSkipLink, never>;
2028
- 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>;
2638
+ private readonly ar;
2639
+ readonly items: _angular_core.InputSignal<DgaNotificationItem[]>;
2640
+ readonly title: _angular_core.InputSignal<string | undefined>;
2641
+ readonly itemClick: _angular_core.OutputEmitterRef<DgaNotificationItem>;
2642
+ readonly markRead: _angular_core.OutputEmitterRef<DgaNotificationItem>;
2643
+ readonly markAllRead: _angular_core.OutputEmitterRef<void>;
2644
+ readonly resolvedTitle: _angular_core.Signal<string>;
2645
+ readonly unreadCount: _angular_core.Signal<number>;
2646
+ readonly markAllLabel: _angular_core.Signal<"تعيين الكل كمقروء" | "Mark all as read">;
2647
+ readonly emptyTitle: _angular_core.Signal<"لا توجد إشعارات" | "No notifications">;
2648
+ readonly emptyBody: _angular_core.Signal<"ستظهر الإشعارات الجديدة هنا." | "New notifications will appear here.">;
2649
+ readonly unreadLabel: _angular_core.Signal<"غير مقروء" | "Unread">;
2650
+ itemClass(item: DgaNotificationItem): string;
2651
+ onItem(item: DgaNotificationItem): void;
2652
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaNotificationInbox, never>;
2653
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaNotificationInbox, "dga-notification-inbox", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "itemClick": "itemClick"; "markRead": "markRead"; "markAllRead": "markAllRead"; }, never, never, true, never>;
2029
2654
  }
2030
2655
 
2031
2656
  declare class DgaAccordionItem {
@@ -2256,6 +2881,8 @@ declare class DgaStepper {
2256
2881
  readonly steps: _angular_core.InputSignal<DgaStep[]>;
2257
2882
  readonly active: _angular_core.ModelSignal<number>;
2258
2883
  readonly label: _angular_core.InputSignal<string>;
2884
+ /** Pulses the current step. Off unless set, and skipped when motion is reduced. */
2885
+ readonly animate: _angular_core.InputSignalWithTransform<boolean, unknown>;
2259
2886
  /**
2260
2887
  * Optional veto for step clicks (e.g. form wizard validation).
2261
2888
  * Return false to keep the current step.
@@ -2268,7 +2895,7 @@ declare class DgaStepper {
2268
2895
  railTone(index: number): string;
2269
2896
  go(index: number): void;
2270
2897
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaStepper, never>;
2271
- 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>;
2898
+ 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; }; "animate": { "alias": "animate"; "required": false; "isSignal": true; }; "beforeActiveChange": { "alias": "beforeActiveChange"; "required": false; "isSignal": true; }; }, { "active": "activeChange"; }, never, never, true, never>;
2272
2899
  }
2273
2900
 
2274
2901
  interface DgaTocItem {
@@ -2287,6 +2914,56 @@ declare class DgaToc {
2287
2914
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaToc, "dga-toc", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "activeId": { "alias": "activeId"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "activeId": "activeIdChange"; "navigate": "navigate"; }, never, never, true, never>;
2288
2915
  }
2289
2916
 
2917
+ /**
2918
+ * Accessible tree view (WAI-ARIA tree). Expand/collapse, keyboard navigation,
2919
+ * optional single or multi select.
2920
+ *
2921
+ * @example
2922
+ * ```html
2923
+ * <dga-tree
2924
+ * [items]="org"
2925
+ * [(expandedIds)]="expanded"
2926
+ * [(selectedIds)]="selected"
2927
+ * />
2928
+ * ```
2929
+ */
2930
+ declare class DgaTree {
2931
+ private static seq;
2932
+ private readonly host;
2933
+ private readonly uid;
2934
+ readonly items: _angular_core.InputSignal<DgaTreeItem[]>;
2935
+ readonly label: _angular_core.InputSignal<string>;
2936
+ readonly expandedIds: _angular_core.ModelSignal<string[]>;
2937
+ readonly selectedIds: _angular_core.ModelSignal<string[]>;
2938
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
2939
+ readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
2940
+ /** Expand a node when it becomes selected. */
2941
+ readonly expandOnSelect: _angular_core.InputSignalWithTransform<boolean, unknown>;
2942
+ readonly selectionChange: _angular_core.OutputEmitterRef<string[]>;
2943
+ readonly expandChange: _angular_core.OutputEmitterRef<string[]>;
2944
+ readonly focusId: _angular_core.WritableSignal<string | null>;
2945
+ readonly expandedSet: _angular_core.Signal<Set<string>>;
2946
+ readonly selectedSet: _angular_core.Signal<Set<string>>;
2947
+ readonly visibleNodes: _angular_core.Signal<DgaTreeItem[]>;
2948
+ resolvedLabel(): string;
2949
+ nodeDomId(id: string): string;
2950
+ hasChildren(item: DgaTreeItem): boolean;
2951
+ isExpanded(id: string): boolean;
2952
+ isSelected(id: string): boolean;
2953
+ twistIcon(id: string): 'chevronDown' | 'chevronLeft' | 'chevronRight';
2954
+ expandAria(item: DgaTreeItem): string;
2955
+ onNodeFocus(id: string): void;
2956
+ onNodeClick(item: DgaTreeItem, event: MouseEvent): void;
2957
+ toggleExpand(id: string, event?: Event): void;
2958
+ selectNode(id: string): void;
2959
+ onTreeKey(event: KeyboardEvent): void;
2960
+ private parentOf;
2961
+ private moveFocus;
2962
+ private focusNode;
2963
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTree, never>;
2964
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTree, "dga-tree", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "expandedIds": { "alias": "expandedIds"; "required": false; "isSignal": true; }; "selectedIds": { "alias": "selectedIds"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandOnSelect": { "alias": "expandOnSelect"; "required": false; "isSignal": true; }; }, { "expandedIds": "expandedIdsChange"; "selectedIds": "selectedIdsChange"; "selectionChange": "selectionChange"; "expandChange": "expandChange"; }, never, never, true, never>;
2965
+ }
2966
+
2290
2967
  interface DgaSideNavItem {
2291
2968
  label: string;
2292
2969
  value: string;
@@ -2427,7 +3104,7 @@ declare class DgaNavRail {
2427
3104
  readonly smoothScroll: _angular_core.InputSignalWithTransform<boolean, unknown>;
2428
3105
  readonly select: _angular_core.OutputEmitterRef<DgaNavRailItem>;
2429
3106
  readonly expandChange: _angular_core.OutputEmitterRef<boolean>;
2430
- readonly edgeAttr: _angular_core.Signal<"start" | "end" | "left" | "right" | null>;
3107
+ readonly edgeAttr: _angular_core.Signal<"left" | "start" | "end" | "right" | null>;
2431
3108
  readonly offsetCss: _angular_core.Signal<string>;
2432
3109
  readonly tooltipPlacement: _angular_core.Signal<"start" | "end">;
2433
3110
  readonly iconSize: _angular_core.Signal<"sm" | "md" | "lg">;
@@ -2467,6 +3144,54 @@ declare class DgaFilterBar {
2467
3144
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaFilterBar, "dga-filter-bar", never, { "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "activeIds": { "alias": "activeIds"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "clearLabel": { "alias": "clearLabel"; "required": false; "isSignal": true; }; }, { "activeIds": "activeIdsChange"; }, never, never, true, never>;
2468
3145
  }
2469
3146
 
3147
+ type DgaSearchBarSize = DgaFormControlSize;
3148
+ /**
3149
+ * Composed search chrome: leading icon, field, clear, and submit.
3150
+ * Distinct from `dga-autocomplete` (suggestion picker).
3151
+ *
3152
+ * @example
3153
+ * ```html
3154
+ * <dga-search-bar
3155
+ * [(value)]="q"
3156
+ * [placeholder]="'Search services'"
3157
+ * (submit)="onSearch($event)"
3158
+ * />
3159
+ * ```
3160
+ */
3161
+ declare class DgaSearchBar implements ControlValueAccessor {
3162
+ readonly value: _angular_core.ModelSignal<string>;
3163
+ readonly controlId: _angular_core.InputSignal<string>;
3164
+ readonly name: _angular_core.InputSignal<string>;
3165
+ readonly label: _angular_core.InputSignal<string>;
3166
+ readonly placeholder: _angular_core.InputSignal<string>;
3167
+ readonly submitLabelInput: _angular_core.InputSignal<string>;
3168
+ readonly size: _angular_core.InputSignal<DgaFormControlSize>;
3169
+ readonly clearable: _angular_core.InputSignalWithTransform<boolean, unknown>;
3170
+ readonly showSubmit: _angular_core.InputSignalWithTransform<boolean, unknown>;
3171
+ readonly disabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
3172
+ private readonly cvaDisabled;
3173
+ readonly disabled: _angular_core.Signal<boolean>;
3174
+ readonly invalid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3175
+ readonly submit: _angular_core.OutputEmitterRef<string>;
3176
+ readonly cleared: _angular_core.OutputEmitterRef<void>;
3177
+ readonly resolvedStatus: _angular_core.Signal<_a_nemreen_dga_ui.DgaFormStatus>;
3178
+ readonly groupClasses: _angular_core.Signal<string>;
3179
+ private onChange;
3180
+ onTouched: () => void;
3181
+ resolvedLabel(): string;
3182
+ submitLabel(): string;
3183
+ clearAria(): string;
3184
+ onInput(raw: string): void;
3185
+ onClear(): void;
3186
+ onSubmit(event: Event): void;
3187
+ writeValue(value: string): void;
3188
+ registerOnChange(fn: (value: string) => void): void;
3189
+ registerOnTouched(fn: () => void): void;
3190
+ setDisabledState(isDisabled: boolean): void;
3191
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaSearchBar, never>;
3192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaSearchBar, "dga-search-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "controlId": { "alias": "controlId"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "submitLabelInput": { "alias": "submitLabel"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "clearable": { "alias": "clearable"; "required": false; "isSignal": true; }; "showSubmit": { "alias": "showSubmit"; "required": false; "isSignal": true; }; "disabledInput": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "submit": "submit"; "cleared": "cleared"; }, never, never, true, never>;
3193
+ }
3194
+
2470
3195
  declare class DgaToolbar {
2471
3196
  readonly label: _angular_core.InputSignal<string>;
2472
3197
  readonly barClasses: _angular_core.Signal<string>;
@@ -2568,7 +3293,7 @@ declare class DgaCard {
2568
3293
  /** Clamp description lines (0 = no clamp). */
2569
3294
  readonly descriptionClamp: _angular_core.InputSignal<number>;
2570
3295
  /** Featured logo icon (renders `dga-icon-badge` unless `[dgaCardLead]` is projected). */
2571
- readonly icon: _angular_core.InputSignal<DgaIconName | null>;
3296
+ readonly icon: _angular_core.InputSignal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut" | null>;
2572
3297
  readonly iconSize: _angular_core.InputSignal<DgaIconBadgeSize>;
2573
3298
  readonly iconAppearance: _angular_core.InputSignal<DgaIconBadgeAppearance>;
2574
3299
  readonly badges: _angular_core.InputSignal<DgaCardBadge[]>;
@@ -2607,7 +3332,7 @@ declare class DgaCardMedia {
2607
3332
  readonly src: _angular_core.InputSignal<string>;
2608
3333
  readonly alt: _angular_core.InputSignal<string>;
2609
3334
  /** Aspect ratio utility; default 16/10 portal news cards. */
2610
- readonly ratio: _angular_core.InputSignal<"video" | "wide" | "square">;
3335
+ readonly ratio: _angular_core.InputSignal<"video" | "square" | "wide">;
2611
3336
  readonly classes: _angular_core.Signal<string>;
2612
3337
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCardMedia, never>;
2613
3338
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCardMedia, "dga-card-media", never, { "src": { "alias": "src"; "required": false; "isSignal": true; }; "alt": { "alias": "alt"; "required": false; "isSignal": true; }; "ratio": { "alias": "ratio"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -2972,10 +3697,15 @@ interface DgaHeroSlide {
2972
3697
  }
2973
3698
  declare class DgaHero {
2974
3699
  private readonly destroyRef;
3700
+ private readonly host;
3701
+ private readonly doc;
3702
+ private readonly swipe;
2975
3703
  private autoplayTimer;
2976
3704
  private readonly autoplayPaused;
2977
3705
  /** Skip CSS transitions on first layout so slides don't animate in like a locale wipe. */
2978
3706
  private readonly motionReady;
3707
+ /** First portal image already hinted in `<head>`, so later slides don't compete. */
3708
+ private lcpPreloadHref;
2979
3709
  /** Single-slide API. */
2980
3710
  readonly title: _angular_core.InputSignal<string>;
2981
3711
  readonly description: _angular_core.InputSignal<string>;
@@ -3029,6 +3759,8 @@ declare class DgaHero {
3029
3759
  portalCtaVariant(): 'inverse' | 'primary';
3030
3760
  /** Secondary is always outline - inverse outline on dark portal surfaces. */
3031
3761
  secondaryCtaVariant(): 'outlineInverse' | 'outline';
3762
+ /** Off-screen carousel slides stay in the DOM for the push animation. */
3763
+ slideInactive(i: number): boolean;
3032
3764
  slideShellClass(i: number): string;
3033
3765
  clampedIndex(): number;
3034
3766
  activeTitle(): string;
@@ -3054,6 +3786,15 @@ declare class DgaHero {
3054
3786
  goSlide(i: number): void;
3055
3787
  nextSlide(): void;
3056
3788
  prevSlide(): void;
3789
+ onPointerDown(event: PointerEvent): void;
3790
+ onPointerMove(event: PointerEvent): void;
3791
+ onPointerUp(event: PointerEvent): void;
3792
+ onPointerCancel(event: PointerEvent): void;
3793
+ private isRtl;
3794
+ /** Portal background that should win LCP. Carousels hint the first slide only. */
3795
+ private lcpImage;
3796
+ private mountLcpPreload;
3797
+ private upsertImagePreload;
3057
3798
  pauseAutoplay(): void;
3058
3799
  resumeAutoplay(): void;
3059
3800
  onPrimary(index?: number): void;
@@ -3110,7 +3851,7 @@ declare class DgaAnnouncementBar {
3110
3851
  readonly align: _angular_core.InputSignal<DgaAnnouncementAlign>;
3111
3852
  readonly actionVariant: _angular_core.InputSignal<DgaAnnouncementActionVariant>;
3112
3853
  readonly elevation: _angular_core.InputSignal<DgaAnnouncementElevation>;
3113
- readonly icon: _angular_core.InputSignal<DgaIconName | null>;
3854
+ readonly icon: _angular_core.InputSignal<"link" | "menu" | "search" | "success" | "info" | "warning" | "error" | "access" | "alertCircle" | "ambulance" | "apple" | "arrowDown" | "arrowDown02" | "arrowLeft" | "arrowLeft02" | "arrowNext" | "arrowNext02" | "arrowPrev" | "arrowPrev02" | "arrowRight" | "arrowRight02" | "arrowUp" | "arrowUp02" | "award" | "badgeCheck" | "bell" | "bellAlt" | "book" | "bookType" | "brain" | "building" | "calendar" | "calendarAlt" | "cart" | "check" | "checkCircle" | "checkCircleAlt" | "chevronDown" | "chevronLeft" | "chevronRight" | "clock" | "close" | "cloud" | "colorPicker" | "colors" | "cookie" | "copy" | "desert" | "devices" | "disability" | "door" | "download" | "droplet" | "external" | "eye" | "eyeOff" | "eyeOffSlash" | "facebook" | "filter" | "fire" | "flash" | "folder" | "glasses" | "globe" | "heading" | "headphones" | "helpCircle" | "highlighter" | "home" | "huawei" | "idCard" | "instagram" | "letterSpacing" | "linkAlt" | "linkedin" | "location" | "lock" | "lockPassword" | "logout" | "mail" | "mask" | "maximize" | "menuAlt" | "message" | "mic" | "minus" | "moon" | "moonAlt" | "moonCloud" | "moreHorizontal" | "moreVertical" | "paintBoard" | "pause" | "phone" | "playStore" | "plus" | "plusSign" | "police" | "printer" | "rain" | "rainZap" | "refresh" | "riyal" | "share" | "shrink" | "smartphone" | "snow" | "sort" | "sortDown" | "sortUp" | "star" | "starFilled" | "sun" | "sunAlt" | "sunCloud" | "textAlign" | "textFont" | "textUnderline" | "touch" | "tradeDown" | "tradeUp" | "translation" | "upload" | "user" | "users" | "whatsapp" | "wheelchair" | "wind" | "x" | "youtube" | "zoomIn" | "zoomOut" | null>;
3114
3855
  readonly dismissible: _angular_core.InputSignalWithTransform<boolean, unknown>;
3115
3856
  readonly dismissLabel: _angular_core.InputSignal<string>;
3116
3857
  readonly actionLabel: _angular_core.InputSignal<string>;
@@ -3258,6 +3999,68 @@ declare class DgaLogoTile {
3258
3999
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaLogoTile, "dga-logo-tile", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3259
4000
  }
3260
4001
 
4002
+ type DgaThemeToggleSurface = 'default' | 'compact';
4003
+ /**
4004
+ * Dark / light theme toggle wired to {@link DgaThemeService}.
4005
+ * Bind icons and labels to `themeChanges` (updated when the reveal commits).
4006
+ *
4007
+ * @example
4008
+ * ```html
4009
+ * <dga-theme-toggle />
4010
+ * <dga-theme-toggle surface="compact" />
4011
+ * ```
4012
+ */
4013
+ declare class DgaThemeToggle {
4014
+ private readonly theme;
4015
+ /** Tooltip / aria when switching *to* dark. */
4016
+ readonly darkLabel: _angular_core.InputSignal<string>;
4017
+ /** Tooltip / aria when switching *to* light. */
4018
+ readonly lightLabel: _angular_core.InputSignal<string>;
4019
+ /** Hit-target sizing. */
4020
+ readonly surface: _angular_core.InputSignal<DgaThemeToggleSurface>;
4021
+ readonly isDark: _angular_core.Signal<boolean>;
4022
+ readonly label: _angular_core.Signal<string>;
4023
+ readonly btnSize: _angular_core.Signal<"sm" | "md">;
4024
+ readonly iconSize: _angular_core.Signal<"sm" | "md">;
4025
+ readonly actionClass: _angular_core.Signal<string>;
4026
+ onToggle(event: Event): void;
4027
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaThemeToggle, never>;
4028
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaThemeToggle, "dga-theme-toggle", never, { "darkLabel": { "alias": "darkLabel"; "required": false; "isSignal": true; }; "lightLabel": { "alias": "lightLabel"; "required": false; "isSignal": true; }; "surface": { "alias": "surface"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4029
+ }
4030
+
4031
+ /**
4032
+ * Language picker listing registered locales from {@link DgaLocaleService}.
4033
+ * Closes on outside pointer / Escape. Dropdown is absolutely positioned.
4034
+ *
4035
+ * @example
4036
+ * ```html
4037
+ * <dga-locale-toggle />
4038
+ * <dga-locale-toggle tooltipLabel="Language" />
4039
+ * ```
4040
+ */
4041
+ declare class DgaLocaleToggle {
4042
+ private readonly localeService;
4043
+ private readonly hostRef;
4044
+ private readonly destroyRef;
4045
+ /** Override the automatic “Language: …” tooltip. */
4046
+ readonly tooltipLabel: _angular_core.InputSignal<string | undefined>;
4047
+ readonly locales: readonly _a_nemreen_dga_tokens.DgaLocaleDefinition[];
4048
+ readonly open: _angular_core.WritableSignal<boolean>;
4049
+ readonly locale: _angular_core.Signal<string>;
4050
+ private readonly seq;
4051
+ readonly listId: string;
4052
+ readonly triggerClass: string;
4053
+ readonly menuClass: string;
4054
+ readonly tooltip: _angular_core.Signal<string>;
4055
+ constructor();
4056
+ toggleMenu(event: Event): void;
4057
+ pick(code: DgaLocale, event: Event): void;
4058
+ onDocPointer(event: PointerEvent): void;
4059
+ onEscape(): void;
4060
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaLocaleToggle, never>;
4061
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaLocaleToggle, "dga-locale-toggle", never, { "tooltipLabel": { "alias": "tooltipLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4062
+ }
4063
+
3261
4064
  declare class DgaPersona {
3262
4065
  readonly name: _angular_core.InputSignal<string>;
3263
4066
  readonly subtitle: _angular_core.InputSignal<string>;
@@ -3509,6 +4312,198 @@ declare class DgaRiyal {
3509
4312
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaRiyal, "dga-riyal", never, { "size": { "alias": "size"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "amount": { "alias": "amount"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3510
4313
  }
3511
4314
 
4315
+ type DgaQrErrorCorrection = 'L' | 'M' | 'Q' | 'H';
4316
+ interface DgaQrMatrix {
4317
+ /** Modules per side (21–177). */
4318
+ size: number;
4319
+ /** modules[y][x] — true = dark. */
4320
+ modules: boolean[][];
4321
+ }
4322
+ /**
4323
+ * Encode text/URL into a QR module matrix.
4324
+ * Throws RangeError when the payload exceeds QR capacity.
4325
+ */
4326
+ declare function dgaEncodeQr(text: string, errorCorrection?: DgaQrErrorCorrection): DgaQrMatrix;
4327
+
4328
+ type DgaQrView = 'svg' | 'canvas' | 'img';
4329
+ type DgaQrSizeToken = 'sm' | 'md' | 'lg' | 'xl';
4330
+ type DgaQrSize = DgaQrSizeToken | number;
4331
+ type DgaQrAnimate = 'none' | 'fade' | 'scale' | 'reveal';
4332
+
4333
+ /**
4334
+ * QR code generator: pass a URL/text via `value` and it renders automatically.
4335
+ *
4336
+ * @example
4337
+ * ```html
4338
+ * <dga-qr value="https://example.gov.sa" size="md" [actions]="true" />
4339
+ * <dga-qr value="https://example.gov.sa" view="canvas" color="#006c35" animate="scale" />
4340
+ * ```
4341
+ */
4342
+ declare class DgaQr {
4343
+ private readonly toasts;
4344
+ private readonly canvasEl;
4345
+ /** Payload to encode (URL or any text). */
4346
+ readonly value: _angular_core.InputSignal<string>;
4347
+ /** Render target. */
4348
+ readonly view: _angular_core.InputSignal<DgaQrView>;
4349
+ /** Token size or pixel length. */
4350
+ readonly size: _angular_core.InputSignal<DgaQrSize>;
4351
+ /** Dark module color. */
4352
+ readonly color: _angular_core.InputSignal<string>;
4353
+ /** Light / background color. */
4354
+ readonly background: _angular_core.InputSignal<string>;
4355
+ /** Error correction level. */
4356
+ readonly errorCorrection: _angular_core.InputSignal<DgaQrErrorCorrection>;
4357
+ /** Quiet-zone modules around the symbol. */
4358
+ readonly margin: _angular_core.InputSignalWithTransform<number, unknown>;
4359
+ /** Accessible label when the QR is meaningful alone. */
4360
+ readonly label: _angular_core.InputSignal<string>;
4361
+ /** Show Download + Copy buttons. */
4362
+ readonly actions: _angular_core.InputSignalWithTransform<boolean, unknown>;
4363
+ /** Load-in animation; replays when `value` changes. */
4364
+ readonly animate: _angular_core.InputSignal<DgaQrAnimate>;
4365
+ /** Download filename base (extension added automatically). */
4366
+ readonly downloadName: _angular_core.InputSignal<string>;
4367
+ readonly ready: _angular_core.OutputEmitterRef<DgaQrMatrix>;
4368
+ readonly downloaded: _angular_core.OutputEmitterRef<string>;
4369
+ readonly copied: _angular_core.OutputEmitterRef<string>;
4370
+ readonly matrix: _angular_core.WritableSignal<DgaQrMatrix | null>;
4371
+ readonly playTick: _angular_core.WritableSignal<number>;
4372
+ readonly imgSrc: _angular_core.WritableSignal<string>;
4373
+ readonly sizeToken: _angular_core.Signal<DgaQrSizeToken | null>;
4374
+ readonly pixelSize: _angular_core.Signal<number>;
4375
+ readonly sizeCss: _angular_core.Signal<string>;
4376
+ readonly svgViewBox: _angular_core.Signal<string>;
4377
+ readonly svgPath: _angular_core.Signal<string>;
4378
+ constructor();
4379
+ hostClasses(): string;
4380
+ frameClasses(): string;
4381
+ actionsLabel(): string;
4382
+ downloadLabel(): string;
4383
+ copyLabel(): string;
4384
+ onCopy(): Promise<void>;
4385
+ onDownload(): void;
4386
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaQr, never>;
4387
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaQr, "dga-qr", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "view": { "alias": "view"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "errorCorrection": { "alias": "errorCorrection"; "required": false; "isSignal": true; }; "margin": { "alias": "margin"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "animate": { "alias": "animate"; "required": false; "isSignal": true; }; "downloadName": { "alias": "downloadName"; "required": false; "isSignal": true; }; }, { "ready": "ready"; "downloaded": "downloaded"; "copied": "copied"; }, never, never, true, never>;
4388
+ }
4389
+
4390
+ /**
4391
+ * Compact Code 128 encoder (Code Set B + Auto C for digit pairs).
4392
+ * Patterns follow ISO/IEC 15417. Zero npm deps — same approach as dga-qr.
4393
+ */
4394
+ interface DgaBarcodeMatrix {
4395
+ /** Bar/space modules left→right (true = bar). Includes quiet zones. */
4396
+ modules: boolean[];
4397
+ /** Human-readable payload that was encoded. */
4398
+ text: string;
4399
+ /** Quiet-zone modules on each side. */
4400
+ quietZone: number;
4401
+ }
4402
+ /**
4403
+ * Encode text as Code 128 (auto B/C). Throws if a character cannot be encoded.
4404
+ */
4405
+ declare function dgaEncodeBarcode(text: string, quietZone?: number): DgaBarcodeMatrix;
4406
+
4407
+ type DgaBarcodeFormat = 'code128';
4408
+ /**
4409
+ * Linear barcode (Code 128). Pair with `dga-qr` on tickets and receipts.
4410
+ *
4411
+ * @example
4412
+ * ```html
4413
+ * <dga-barcode value="TKT-2026-0042" [displayValue]="true" [actions]="true" />
4414
+ * ```
4415
+ */
4416
+ declare class DgaBarcode {
4417
+ /** Payload to encode (ASCII printable). */
4418
+ readonly value: _angular_core.InputSignal<string>;
4419
+ /** Symbology — Code 128 only for now. */
4420
+ readonly format: _angular_core.InputSignal<"code128">;
4421
+ /** Bar height in CSS pixels. */
4422
+ readonly height: _angular_core.InputSignalWithTransform<number, unknown>;
4423
+ /** Module (bar unit) width in CSS pixels. */
4424
+ readonly moduleWidth: _angular_core.InputSignalWithTransform<number, unknown>;
4425
+ /** Quiet-zone modules on each side. */
4426
+ readonly quietZone: _angular_core.InputSignalWithTransform<number, unknown>;
4427
+ /** Show human-readable text under the bars. */
4428
+ readonly displayValue: _angular_core.InputSignalWithTransform<boolean, unknown>;
4429
+ /** Bar color. */
4430
+ readonly color: _angular_core.InputSignal<string>;
4431
+ /** Background / quiet-zone color. */
4432
+ readonly background: _angular_core.InputSignal<string>;
4433
+ /** Accessible label when the barcode is meaningful alone. */
4434
+ readonly label: _angular_core.InputSignal<string>;
4435
+ /** Show download action. */
4436
+ readonly actions: _angular_core.InputSignalWithTransform<boolean, unknown>;
4437
+ /** Download filename base. */
4438
+ readonly downloadName: _angular_core.InputSignal<string>;
4439
+ readonly ready: _angular_core.OutputEmitterRef<DgaBarcodeMatrix>;
4440
+ readonly downloaded: _angular_core.OutputEmitterRef<string>;
4441
+ readonly matrix: _angular_core.WritableSignal<DgaBarcodeMatrix | null>;
4442
+ readonly barHeight: _angular_core.Signal<number>;
4443
+ readonly modulePx: _angular_core.Signal<number>;
4444
+ readonly svgWidth: _angular_core.Signal<number>;
4445
+ readonly svgViewBox: _angular_core.Signal<string>;
4446
+ readonly svgPath: _angular_core.Signal<string>;
4447
+ constructor();
4448
+ hostClasses(): string;
4449
+ actionsLabel(): string;
4450
+ downloadLabel(): string;
4451
+ onDownload(): void;
4452
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaBarcode, never>;
4453
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaBarcode, "dga-barcode", never, { "value": { "alias": "value"; "required": true; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "moduleWidth": { "alias": "moduleWidth"; "required": false; "isSignal": true; }; "quietZone": { "alias": "quietZone"; "required": false; "isSignal": true; }; "displayValue": { "alias": "displayValue"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "downloadName": { "alias": "downloadName"; "required": false; "isSignal": true; }; }, { "ready": "ready"; "downloaded": "downloaded"; }, never, never, true, never>;
4454
+ }
4455
+
4456
+ type DgaMapEmbedAspect = 'video' | 'wide' | 'square' | 'portrait';
4457
+ /**
4458
+ * Safe map iframe — only allowlisted embed URLs (Google / Apple / OSM / .gov.sa).
4459
+ * Arbitrary iframes are rejected and an accessible error is shown instead.
4460
+ *
4461
+ * @example
4462
+ * ```html
4463
+ * <dga-map-embed
4464
+ * title="Headquarters"
4465
+ * src="https://www.google.com/maps/embed?pb=…"
4466
+ * aspect="video"
4467
+ * />
4468
+ * ```
4469
+ */
4470
+ declare class DgaMapEmbed {
4471
+ private readonly sanitizer;
4472
+ /** Embed URL — must pass `dgaIsAllowedMapEmbedUrl`. */
4473
+ readonly src: _angular_core.InputSignal<string>;
4474
+ /** Required accessible name for the iframe. */
4475
+ readonly title: _angular_core.InputSignal<string>;
4476
+ /** Aspect-ratio token. */
4477
+ readonly aspect: _angular_core.InputSignal<DgaMapEmbedAspect>;
4478
+ /**
4479
+ * Optional iframe sandbox tokens. Empty by default — Google Maps embeds break
4480
+ * under sandbox; rely on the URL allowlist instead. Set explicitly when needed.
4481
+ */
4482
+ readonly sandbox: _angular_core.InputSignal<string>;
4483
+ /** Optional fixed height in px (overrides aspect when set). */
4484
+ readonly height: _angular_core.InputSignalWithTransform<number | null, unknown>;
4485
+ readonly allowed: _angular_core.Signal<boolean>;
4486
+ readonly canEmbed: _angular_core.Signal<boolean>;
4487
+ readonly safeSrc: _angular_core.Signal<SafeResourceUrl>;
4488
+ readonly aspectCss: _angular_core.Signal<string | null>;
4489
+ readonly shellStyle: _angular_core.Signal<{
4490
+ height: string | null;
4491
+ aspectRatio: string | null;
4492
+ }>;
4493
+ frameClasses(): string;
4494
+ blockedTitle(): string;
4495
+ blockedBody(): string;
4496
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaMapEmbed, never>;
4497
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaMapEmbed, "dga-map-embed", never, { "src": { "alias": "src"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": true; "isSignal": true; }; "aspect": { "alias": "aspect"; "required": false; "isSignal": true; }; "sandbox": { "alias": "sandbox"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4498
+ }
4499
+
4500
+ /**
4501
+ * Allowlist check for map embed iframes — never load arbitrary URLs.
4502
+ * Google Maps embed, Apple Maps, OpenStreetMap, and common .gov.sa GIS embeds.
4503
+ */
4504
+ /** True when `url` is a permitted map embed (https + allowlisted host/path). */
4505
+ declare function dgaIsAllowedMapEmbedUrl(url: string): boolean;
4506
+
3512
4507
  type DgaMetricTrend = 'up' | 'down' | 'neutral';
3513
4508
  /** `stat` = portal home metrics (icon well, value, label, centered). */
3514
4509
  type DgaMetricAppearance = 'default' | 'stat';
@@ -3527,23 +4522,267 @@ declare class DgaMetric {
3527
4522
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaMetric, "dga-metric", never, { "label": { "alias": "label"; "required": true; "isSignal": true; }; "value": { "alias": "value"; "required": true; "isSignal": true; }; "delta": { "alias": "delta"; "required": false; "isSignal": true; }; "trend": { "alias": "trend"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, ["[dgaMetricIcon]"], true, never>;
3528
4523
  }
3529
4524
 
4525
+ type DgaStatStripTrend = DgaMetricTrend;
4526
+ interface DgaStatStripItem {
4527
+ id?: string;
4528
+ label: string;
4529
+ value: string;
4530
+ delta?: string;
4531
+ trend?: DgaStatStripTrend;
4532
+ }
4533
+ /**
4534
+ * Dense horizontal KPI strip for portal dashboards.
4535
+ * Prefer `dga-metric` when each KPI needs a full card.
4536
+ *
4537
+ * @example
4538
+ * ```html
4539
+ * <dga-stat-strip [items]="stats" />
4540
+ * ```
4541
+ */
4542
+ declare class DgaStatStrip {
4543
+ private readonly uiLocale;
4544
+ readonly items: _angular_core.InputSignal<DgaStatStripItem[]>;
4545
+ /** Accessible name for the strip. */
4546
+ readonly label: _angular_core.InputSignal<string>;
4547
+ /** `divided` adds separators between items. */
4548
+ readonly appearance: _angular_core.InputSignal<"plain" | "divided" | "card">;
4549
+ readonly listClasses: _angular_core.Signal<string>;
4550
+ readonly itemClasses: _angular_core.Signal<string>;
4551
+ trackItem(item: DgaStatStripItem, index: number): string;
4552
+ deltaClasses(trend: DgaStatStripTrend | undefined): string;
4553
+ trendGlyph(trend: DgaStatStripTrend | undefined): string;
4554
+ trendLabel(trend: DgaStatStripTrend | undefined): string;
4555
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaStatStrip, never>;
4556
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaStatStrip, "dga-stat-strip", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4557
+ }
4558
+
4559
+ interface DgaFaqItem {
4560
+ id: string;
4561
+ question: string;
4562
+ answer: string;
4563
+ /** Open this item on first render. */
4564
+ open?: boolean;
4565
+ }
4566
+ /**
4567
+ * FAQ pattern on top of `dga-accordion`: Q&A sections plus optional FAQPage JSON-LD.
4568
+ *
4569
+ * @example
4570
+ * ```html
4571
+ * <dga-faq [items]="items" heading="الأسئلة الشائعة" />
4572
+ * ```
4573
+ */
4574
+ declare class DgaFaq {
4575
+ private readonly document;
4576
+ private readonly destroyRef;
4577
+ readonly items: _angular_core.InputSignal<readonly DgaFaqItem[]>;
4578
+ /** Optional visible heading above the accordion. */
4579
+ readonly heading: _angular_core.InputSignal<string>;
4580
+ /** Accessible name when heading is empty. */
4581
+ readonly label: _angular_core.InputSignal<string>;
4582
+ /** Allow multiple answers open at once. */
4583
+ readonly multiple: _angular_core.InputSignalWithTransform<boolean, unknown>;
4584
+ /** Emit FAQPage JSON-LD into `<head>` while mounted. */
4585
+ readonly jsonLd: _angular_core.InputSignalWithTransform<boolean, unknown>;
4586
+ readonly sections: _angular_core.Signal<DgaAccordionSection[]>;
4587
+ private scriptEl;
4588
+ constructor();
4589
+ private writeJsonLd;
4590
+ private removeJsonLd;
4591
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaFaq, never>;
4592
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaFaq, "dga-faq", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "jsonLd": { "alias": "jsonLd"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
4593
+ }
4594
+
4595
+ /** Calendar system for date values and the picker UI. */
4596
+ type DgaDateCalendar = 'gregorian' | 'hijri';
4597
+ /** Picker UI mode — inferred from `format` tokens when not set explicitly. */
4598
+ type DgaDatePickerMode = 'day' | 'month' | 'year';
4599
+ type DgaDateLocale = string;
4600
+ interface DgaCalendarParts {
4601
+ year: number;
4602
+ month: number;
4603
+ day: number;
4604
+ }
4605
+ declare const DGA_HIJRI_MONTHS: {
4606
+ readonly ar: readonly ["محرم", "صفر", "ربيع الأول", "ربيع الثاني", "جمادى الأولى", "جمادى الآخرة", "رجب", "شعبان", "رمضان", "شوال", "ذو القعدة", "ذو الحجة"];
4607
+ 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"];
4608
+ };
4609
+ declare const DGA_GREGORIAN_MONTHS: {
4610
+ readonly ar: readonly ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"];
4611
+ readonly en: readonly ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
4612
+ };
4613
+ declare const DGA_WEEKDAYS: {
4614
+ readonly ar: readonly ["أحد", "إثن", "ثلا", "أرب", "خمي", "جمع", "سبت"];
4615
+ readonly en: readonly ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
4616
+ };
4617
+ /** Read calendar parts for a Date (UTC day). */
4618
+ declare function dgaGetCalendarParts(date: Date, calendar: DgaDateCalendar): DgaCalendarParts;
4619
+ /**
4620
+ * Convert calendar parts to a Date (UTC midnight).
4621
+ * Hijri conversion uses binary search against islamic-umalqura.
4622
+ */
4623
+ declare function dgaPartsToDate(parts: DgaCalendarParts, calendar: DgaDateCalendar): Date;
4624
+ declare function dgaDaysInMonth(year: number, month: number, calendar: DgaDateCalendar): number;
4625
+ declare function dgaAddMonths(parts: DgaCalendarParts, delta: number, calendar: DgaDateCalendar): DgaCalendarParts;
4626
+ /** Infer mode from format tokens (YYYY / MM / DD). */
4627
+ declare function dgaModeFromFormat(format: string): DgaDatePickerMode;
4628
+ declare function dgaFormatDate(date: Date, format: string, calendar: DgaDateCalendar): string;
4629
+ declare function dgaParseDate(value: string, format: string, calendar: DgaDateCalendar): Date | null;
4630
+ declare function dgaSameDay(a: Date | null, b: Date | null, calendar?: DgaDateCalendar): boolean;
4631
+ declare function dgaCompareDays(a: Date | null, b: Date | null, calendar?: DgaDateCalendar): number;
4632
+ declare function dgaClampDate(date: Date, min?: Date | null, max?: Date | null, calendar?: DgaDateCalendar): Date;
4633
+ declare function dgaMonthNames(calendar: DgaDateCalendar, locale: string): readonly string[];
4634
+ /** First weekday (0=Sun) of the given calendar month. */
4635
+ declare function dgaMonthStartWeekday(year: number, month: number, calendar: DgaDateCalendar): number;
4636
+ declare function dgaTodayUtc(): Date;
4637
+ /** Coerce string | Date | null to UTC date using format when string. */
4638
+ declare function dgaCoerceDate(value: string | Date | null | undefined, format: string, calendar: DgaDateCalendar): Date | null;
4639
+
4640
+ interface DgaCalendarEvent {
4641
+ id: string;
4642
+ title: string;
4643
+ /** ISO Gregorian date `yyyy-mm-dd` (events stay Gregorian across calendars). */
4644
+ date: string;
4645
+ /** Optional accent color for the event indicator (CSS color). */
4646
+ tone?: string;
4647
+ }
4648
+ /**
4649
+ * Month grid with events (appointments / queues).
4650
+ * Named `DgaEventCalendar` to avoid clashing with top-bar `DgaCalendar` type.
4651
+ * Supports Gregorian and Hijri (Umm al-Qura) display via `calendar`.
4652
+ */
4653
+ declare class DgaEventCalendar {
4654
+ private readonly uiLocale;
4655
+ private readonly ar;
4656
+ readonly events: _angular_core.InputSignal<DgaCalendarEvent[]>;
4657
+ /** Anchor date for the visible month (any day in that Gregorian month works). */
4658
+ readonly month: _angular_core.ModelSignal<Date>;
4659
+ readonly selectedDay: _angular_core.ModelSignal<string>;
4660
+ /** Display calendar system. */
4661
+ readonly calendar: _angular_core.ModelSignal<DgaDateCalendar>;
4662
+ readonly daySelect: _angular_core.OutputEmitterRef<string>;
4663
+ readonly eventSelect: _angular_core.OutputEmitterRef<DgaCalendarEvent>;
4664
+ readonly weekdays: _angular_core.Signal<string[]>;
4665
+ readonly monthLabel: _angular_core.Signal<string>;
4666
+ readonly prevLabel: _angular_core.Signal<"الشهر السابق" | "Previous month">;
4667
+ readonly nextLabel: _angular_core.Signal<"الشهر التالي" | "Next month">;
4668
+ readonly todayLabel: _angular_core.Signal<"اليوم" | "Today">;
4669
+ readonly eventsLabel: _angular_core.Signal<"أحداث اليوم" | "Events for day">;
4670
+ readonly pickDayLabel: _angular_core.Signal<"الأحداث" | "Events">;
4671
+ readonly pickDayHint: _angular_core.Signal<"اختر يوماً لعرض الأحداث" | "Select a day to view events">;
4672
+ readonly noEventsLabel: _angular_core.Signal<"لا توجد أحداث في هذا اليوم" | "No events on this day">;
4673
+ readonly gregorianLabel: _angular_core.Signal<"ميلادي" | "Gregorian">;
4674
+ readonly hijriLabel: _angular_core.Signal<"هجري" | "Hijri">;
4675
+ readonly calendarGroupLabel: _angular_core.Signal<"نظام التقويم" | "Calendar system">;
4676
+ readonly selectedDayLabel: _angular_core.Signal<string>;
4677
+ readonly eventsByDate: _angular_core.Signal<Map<string, DgaCalendarEvent[]>>;
4678
+ readonly todayIso: _angular_core.Signal<string>;
4679
+ readonly cells: _angular_core.Signal<{
4680
+ key: string;
4681
+ day: number;
4682
+ iso: string;
4683
+ inMonth: boolean;
4684
+ count: number;
4685
+ tones: string[];
4686
+ isToday: boolean;
4687
+ }[]>;
4688
+ readonly dayEvents: _angular_core.Signal<DgaCalendarEvent[]>;
4689
+ shiftMonth(delta: number): void;
4690
+ goToday(): void;
4691
+ selectDay(iso: string): void;
4692
+ dayClass(cell: {
4693
+ inMonth: boolean;
4694
+ iso: string;
4695
+ count: number;
4696
+ isToday: boolean;
4697
+ }): string;
4698
+ eventCountLabel(n: number): string;
4699
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaEventCalendar, never>;
4700
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaEventCalendar, "dga-event-calendar", never, { "events": { "alias": "events"; "required": false; "isSignal": true; }; "month": { "alias": "month"; "required": false; "isSignal": true; }; "selectedDay": { "alias": "selectedDay"; "required": false; "isSignal": true; }; "calendar": { "alias": "calendar"; "required": false; "isSignal": true; }; }, { "month": "monthChange"; "selectedDay": "selectedDayChange"; "calendar": "calendarChange"; "daySelect": "daySelect"; "eventSelect": "eventSelect"; }, never, never, true, never>;
4701
+ }
4702
+
4703
+ /** Cell template: `<ng-template dgaCellDef="status" let-row>…</ng-template>` */
4704
+ declare class DgaCellDef {
4705
+ readonly dgaCellDef: _angular_core.InputSignal<string>;
4706
+ readonly template: TemplateRef<any>;
4707
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCellDef, never>;
4708
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaCellDef, "ng-template[dgaCellDef]", never, { "dgaCellDef": { "alias": "dgaCellDef"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
4709
+ }
4710
+ /** Expandable row body: `<ng-template dgaExpandDef let-row>…</ng-template>` */
4711
+ declare class DgaExpandDef {
4712
+ readonly template: TemplateRef<any>;
4713
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaExpandDef, never>;
4714
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaExpandDef, "ng-template[dgaExpandDef]", never, {}, {}, never, never, true, never>;
4715
+ }
4716
+ /** Row overflow actions: `<ng-template dgaRowActions let-row>…</ng-template>` */
4717
+ declare class DgaRowActionsDef {
4718
+ readonly template: TemplateRef<any>;
4719
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaRowActionsDef, never>;
4720
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaRowActionsDef, "ng-template[dgaRowActions]", never, {}, {}, never, never, true, never>;
4721
+ }
4722
+ /** Custom mobile card: `<ng-template dgaCardDef let-row>…</ng-template>` */
4723
+ declare class DgaCardDef {
4724
+ readonly template: TemplateRef<any>;
4725
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaCardDef, never>;
4726
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaCardDef, "ng-template[dgaCardDef]", never, {}, {}, never, never, true, never>;
4727
+ }
4728
+ interface DgaCellContext {
4729
+ $implicit: Record<string, unknown>;
4730
+ row: Record<string, unknown>;
4731
+ column?: string;
4732
+ index: number;
4733
+ }
4734
+
3530
4735
  interface DgaTableColumn<T = Record<string, unknown>> {
3531
4736
  key: string;
3532
4737
  label: string;
3533
4738
  sortable?: boolean;
4739
+ /** Show a text filter under the header. */
4740
+ filterable?: boolean;
4741
+ /** Pin column to the inline-start or inline-end edge while scrolling. */
4742
+ pinned?: 'start' | 'end';
4743
+ /** Optional CSS width (e.g. `8rem`, `120px`). */
4744
+ width?: string;
4745
+ /** Client sort strategy when not using `compare`. */
4746
+ sortType?: 'string' | 'number' | 'date';
4747
+ /** Custom client comparator (a, b cell values). */
4748
+ compare?: (a: unknown, b: unknown) => number;
3534
4749
  }
3535
4750
  type DgaSortDir = 'asc' | 'desc';
3536
4751
  type DgaTableDensity = 'comfortable' | 'compact';
4752
+ type DgaTableViewMode = 'table' | 'cards' | 'auto';
4753
+ type DgaTableResolvedView = 'table' | 'cards';
4754
+ interface DgaTableSortEvent {
4755
+ key: string;
4756
+ dir: DgaSortDir;
4757
+ }
4758
+ interface DgaTableFilterEvent {
4759
+ /** Column key → filter query (empty string clears). */
4760
+ filters: Record<string, string>;
4761
+ }
4762
+ interface DgaTablePageEvent {
4763
+ page: number;
4764
+ pageSize: number;
4765
+ }
3537
4766
  declare class DgaTable {
4767
+ private readonly destroyRef;
3538
4768
  private readonly uiLocale;
3539
4769
  private readonly ar;
3540
4770
  readonly columns: _angular_core.InputSignal<DgaTableColumn<Record<string, unknown>>[]>;
3541
4771
  readonly rows: _angular_core.InputSignal<Record<string, unknown>[]>;
3542
4772
  readonly selectable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4773
+ /** Enables expand controls; requires an `ng-template dgaExpandDef`. */
4774
+ readonly expandable: _angular_core.InputSignalWithTransform<boolean, unknown>;
4775
+ /**
4776
+ * When true, sort/filter/page only emit events — host owns the row list
4777
+ * (server-driven tables).
4778
+ */
4779
+ readonly serverSide: _angular_core.InputSignalWithTransform<boolean, unknown>;
3543
4780
  readonly idKey: _angular_core.InputSignal<string>;
3544
4781
  readonly selectedKeys: _angular_core.ModelSignal<string[]>;
3545
4782
  readonly sortKey: _angular_core.ModelSignal<string>;
3546
4783
  readonly sortDir: _angular_core.ModelSignal<DgaSortDir>;
4784
+ readonly columnFilters: _angular_core.ModelSignal<Record<string, string>>;
4785
+ readonly expandedKeys: _angular_core.ModelSignal<string[]>;
3547
4786
  readonly label: _angular_core.InputSignal<string | undefined>;
3548
4787
  readonly selectAllLabel: _angular_core.InputSignal<string | undefined>;
3549
4788
  readonly emptyLabel: _angular_core.InputSignal<string | undefined>;
@@ -3552,35 +4791,217 @@ declare class DgaTable {
3552
4791
  readonly loading: _angular_core.InputSignalWithTransform<boolean, unknown>;
3553
4792
  readonly stickyHeader: _angular_core.InputSignalWithTransform<boolean, unknown>;
3554
4793
  readonly hiddenKeys: _angular_core.ModelSignal<string[]>;
4794
+ /** 1-based page. Pagination UI shows when `pageSize > 0`. */
4795
+ readonly page: _angular_core.ModelSignal<number>;
4796
+ /** Page size; `0` disables pagination (show all rows). */
4797
+ readonly pageSize: _angular_core.ModelSignal<number>;
4798
+ /** Total rows for server-side pagination; client mode uses filtered length. */
4799
+ readonly total: _angular_core.InputSignal<number | undefined>;
4800
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
4801
+ /** Debounce for `filterChange` output (ms). Model updates stay immediate. */
4802
+ readonly filterDebounceMs: _angular_core.InputSignalWithTransform<number, unknown>;
4803
+ /** Error message; renders alert + retry when set. */
4804
+ readonly error: _angular_core.InputSignal<string | null>;
4805
+ /**
4806
+ * Presentation mode. `auto` follows `cardsBreakpoint` via matchMedia.
4807
+ */
4808
+ readonly viewMode: _angular_core.ModelSignal<DgaTableViewMode>;
4809
+ readonly cardsBreakpoint: _angular_core.InputSignal<string>;
4810
+ /** Column key used as card title; defaults to first visible column. */
4811
+ readonly cardTitleKey: _angular_core.InputSignal<string | undefined>;
4812
+ readonly sortChange: _angular_core.OutputEmitterRef<DgaTableSortEvent>;
4813
+ readonly filterChange: _angular_core.OutputEmitterRef<DgaTableFilterEvent>;
4814
+ /** Emits when the page index or page size changes (includes both). */
4815
+ readonly pagingChange: _angular_core.OutputEmitterRef<DgaTablePageEvent>;
4816
+ readonly errorRetry: _angular_core.OutputEmitterRef<void>;
3555
4817
  readonly skeletonRows: number[];
4818
+ private readonly cellDefs;
4819
+ private readonly expandDef;
4820
+ private readonly rowActionsDef;
4821
+ private readonly cardDef;
4822
+ private readonly selectAllEl;
4823
+ private readonly cellMap;
4824
+ private readonly mqMatches;
4825
+ /** Cards-mode global search (matches any visible column). */
4826
+ readonly cardsQuery: _angular_core.WritableSignal<string>;
4827
+ private filterTimer;
4828
+ private skipPageEmit;
3556
4829
  readonly resolvedLabel: _angular_core.Signal<string>;
3557
4830
  readonly resolvedSelectAllLabel: _angular_core.Signal<string>;
3558
4831
  readonly resolvedEmptyLabel: _angular_core.Signal<string>;
3559
4832
  readonly selectedCountLabel: _angular_core.Signal<string>;
3560
- private readonly selectAllEl;
4833
+ readonly retryLabel: _angular_core.Signal<"إعادة المحاولة" | "Retry">;
4834
+ readonly clearFiltersLabel: _angular_core.Signal<"مسح التصفية" | "Clear filters">;
4835
+ readonly actionsLabel: _angular_core.Signal<"إجراءات" | "Actions">;
4836
+ readonly pageSizeLabel: _angular_core.Signal<"لكل صفحة" | "Per page">;
4837
+ readonly errorTitle: _angular_core.Signal<"تعذر التحميل" | "Failed to load">;
4838
+ readonly cardsSearchLabel: _angular_core.Signal<"بحث" | "Search">;
4839
+ readonly cardsSearchPlaceholder: _angular_core.Signal<"ابحث في النتائج…" | "Search results…">;
4840
+ readonly cardsSortLabel: _angular_core.Signal<"فرز حسب" | "Sort by">;
4841
+ readonly cardsSortPlaceholder: _angular_core.Signal<"بدون فرز" | "No sort">;
4842
+ readonly cardsSortDirLabel: _angular_core.Signal<"تصاعدي — انقر للتبديل" | "Ascending — click to toggle" | "تنازلي — انقر للتبديل" | "Descending — click to toggle">;
4843
+ readonly resolvedView: _angular_core.Signal<DgaTableResolvedView>;
4844
+ readonly paginationEnabled: _angular_core.Signal<boolean>;
4845
+ readonly filteredCount: _angular_core.Signal<number>;
4846
+ readonly totalPages: _angular_core.Signal<number>;
4847
+ readonly rangeLabel: _angular_core.Signal<string>;
3561
4848
  constructor();
4849
+ private bindBreakpoint;
3562
4850
  readonly visibleColumns: _angular_core.Signal<DgaTableColumn<Record<string, unknown>>[]>;
4851
+ readonly filterableColumns: _angular_core.Signal<DgaTableColumn<Record<string, unknown>>[]>;
4852
+ readonly sortableColumns: _angular_core.Signal<DgaTableColumn<Record<string, unknown>>[]>;
4853
+ readonly cardTitleColumn: _angular_core.Signal<DgaTableColumn<Record<string, unknown>>>;
4854
+ readonly cardBodyColumns: _angular_core.Signal<DgaTableColumn<Record<string, unknown>>[]>;
3563
4855
  readonly selectPad: _angular_core.Signal<"w-4xl px-lg py-xs" | "w-4xl px-lg py-md">;
3564
4856
  readonly headerPad: _angular_core.Signal<string>;
3565
4857
  readonly bodyPad: _angular_core.Signal<string>;
4858
+ readonly cardPad: _angular_core.Signal<"px-md py-sm" | "px-lg py-md">;
3566
4859
  readonly rowClasses: _angular_core.Signal<string>;
3567
- readonly sortedRows: _angular_core.Signal<Record<string, unknown>[]>;
4860
+ /** Filter + sort (client) or raw rows (server). */
4861
+ readonly filteredRows: _angular_core.Signal<Record<string, unknown>[]>;
4862
+ /** Current page of rows (or all when pagination off / serverSide). */
4863
+ readonly displayRows: _angular_core.Signal<Record<string, unknown>[]>;
3568
4864
  readonly allSelected: _angular_core.Signal<boolean>;
3569
4865
  readonly someSelected: _angular_core.Signal<boolean>;
4866
+ hasRowActions(): boolean;
4867
+ hasFilterOrSortChrome(): boolean;
4868
+ hasActiveFilters(): boolean;
4869
+ onCardsSearch(value: string): void;
4870
+ onCardsSortKey(key: string): void;
4871
+ emptyHint(): string;
4872
+ cellTemplate(key: string): TemplateRef<DgaCellContext> | null;
4873
+ expandTemplate(): TemplateRef<DgaCellContext> | null;
4874
+ rowActionsTemplate(): TemplateRef<DgaCellContext> | null;
4875
+ cardTemplate(): TemplateRef<DgaCellContext> | null;
4876
+ cellContext(row: Record<string, unknown>, column: string | undefined, index: number): DgaCellContext;
4877
+ headerCellClass(col: DgaTableColumn): string;
4878
+ bodyCellClass(col: DgaTableColumn): string;
4879
+ private pinClass;
4880
+ filterPlaceholder(): string;
4881
+ filterAria(col: DgaTableColumn): string;
3570
4882
  rowKey(row: Record<string, unknown>): string;
3571
4883
  cellValue(row: Record<string, unknown>, key: string): string;
4884
+ cardTitle(row: Record<string, unknown>): string;
3572
4885
  isSelected(row: Record<string, unknown>): boolean;
4886
+ isExpanded(row: Record<string, unknown>): boolean;
4887
+ expandLabel(row: Record<string, unknown>): string;
3573
4888
  rowSelectLabel(row: Record<string, unknown>): string;
3574
4889
  selectAllAria(): 'true' | 'false' | 'mixed';
3575
4890
  emptyColspan(): number;
3576
4891
  ariaSort(key: string): 'ascending' | 'descending' | 'none' | null;
3577
4892
  sortGlyph(key: string): string;
3578
4893
  toggleSort(key: string): void;
4894
+ onFilter(key: string, value: string): void;
4895
+ clearFilters(): void;
4896
+ onPageSizeChange(size: number): void;
4897
+ onPageModelChange(next: number): void;
4898
+ toggleExpand(row: Record<string, unknown>): void;
3579
4899
  toggleRow(row: Record<string, unknown>): void;
3580
4900
  toggleAll(): void;
3581
4901
  private rowKeys;
3582
4902
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTable, never>;
3583
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTable, "dga-table", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "idKey": { "alias": "idKey"; "required": false; "isSignal": true; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; "isSignal": true; }; "sortKey": { "alias": "sortKey"; "required": false; "isSignal": true; }; "sortDir": { "alias": "sortDir"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "hiddenKeys": { "alias": "hiddenKeys"; "required": false; "isSignal": true; }; }, { "selectedKeys": "selectedKeysChange"; "sortKey": "sortKeyChange"; "sortDir": "sortDirChange"; "hiddenKeys": "hiddenKeysChange"; }, never, never, true, never>;
4903
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTable, "dga-table", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "serverSide": { "alias": "serverSide"; "required": false; "isSignal": true; }; "idKey": { "alias": "idKey"; "required": false; "isSignal": true; }; "selectedKeys": { "alias": "selectedKeys"; "required": false; "isSignal": true; }; "sortKey": { "alias": "sortKey"; "required": false; "isSignal": true; }; "sortDir": { "alias": "sortDir"; "required": false; "isSignal": true; }; "columnFilters": { "alias": "columnFilters"; "required": false; "isSignal": true; }; "expandedKeys": { "alias": "expandedKeys"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; "density": { "alias": "density"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "stickyHeader": { "alias": "stickyHeader"; "required": false; "isSignal": true; }; "hiddenKeys": { "alias": "hiddenKeys"; "required": false; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "total": { "alias": "total"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "filterDebounceMs": { "alias": "filterDebounceMs"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "viewMode": { "alias": "viewMode"; "required": false; "isSignal": true; }; "cardsBreakpoint": { "alias": "cardsBreakpoint"; "required": false; "isSignal": true; }; "cardTitleKey": { "alias": "cardTitleKey"; "required": false; "isSignal": true; }; }, { "selectedKeys": "selectedKeysChange"; "sortKey": "sortKeyChange"; "sortDir": "sortDirChange"; "columnFilters": "columnFiltersChange"; "expandedKeys": "expandedKeysChange"; "hiddenKeys": "hiddenKeysChange"; "page": "pageChange"; "pageSize": "pageSizeChange"; "viewMode": "viewModeChange"; "sortChange": "sortChange"; "filterChange": "filterChange"; "pagingChange": "pagingChange"; "errorRetry": "errorRetry"; }, ["cellDefs", "expandDef", "rowActionsDef", "cardDef"], ["[dgaTableToolbar]", "[dgaTableError]", "[dgaTableBulk]", "[dgaTableFooter]", "[dgaTableEmpty]"], true, never>;
4904
+ }
4905
+
4906
+ /**
4907
+ * Checkbox list that two-way binds `hiddenKeys` for `dga-table`.
4908
+ * Project into `[dgaTableToolbar]` or place beside the table.
4909
+ */
4910
+ declare class DgaTableColumnPicker {
4911
+ private readonly uiLocale;
4912
+ private readonly ar;
4913
+ readonly columns: _angular_core.InputSignal<DgaTableColumn<Record<string, unknown>>[]>;
4914
+ readonly hiddenKeys: _angular_core.ModelSignal<string[]>;
4915
+ readonly label: _angular_core.InputSignal<string | undefined>;
4916
+ readonly resolvedLabel: _angular_core.Signal<string>;
4917
+ isVisible(key: string): boolean;
4918
+ toggle(key: string): void;
4919
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaTableColumnPicker, never>;
4920
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaTableColumnPicker, "dga-table-column-picker", never, { "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "hiddenKeys": { "alias": "hiddenKeys"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "hiddenKeys": "hiddenKeysChange"; }, never, never, true, never>;
4921
+ }
4922
+
4923
+ /** Context for `ng-template dgaVirtualItem let-item let-index="index"`. */
4924
+ interface DgaVirtualItemContext<T = unknown> {
4925
+ $implicit: T;
4926
+ index: number;
4927
+ }
4928
+ /**
4929
+ * Marks the item row template for {@link DgaVirtualList}.
4930
+ *
4931
+ * @example
4932
+ * ```html
4933
+ * <ng-template dgaVirtualItem let-item let-index="index">
4934
+ * {{ index }} — {{ item.name }}
4935
+ * </ng-template>
4936
+ * ```
4937
+ */
4938
+ declare class DgaVirtualItem<T = unknown> {
4939
+ readonly template: TemplateRef<any>;
4940
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaVirtualItem<any>, never>;
4941
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<DgaVirtualItem<any>, "ng-template[dgaVirtualItem]", never, {}, {}, never, never, true, never>;
4942
+ }
4943
+ interface VisibleRow {
4944
+ item: unknown;
4945
+ index: number;
4946
+ track: string | number;
4947
+ }
4948
+ /**
4949
+ * Pure Angular virtual list (no CDK). Renders a window of rows with a
4950
+ * transform / total-height spacer. Emits `scrolledToEnd` near the bottom
4951
+ * for infinite-scroll consumers.
4952
+ *
4953
+ * @example
4954
+ * ```html
4955
+ * <dga-virtual-list
4956
+ * [items]="rows"
4957
+ * [itemHeight]="48"
4958
+ * trackByKey="id"
4959
+ * [loadingMore]="busy"
4960
+ * (scrolledToEnd)="loadMore()"
4961
+ * >
4962
+ * <ng-template dgaVirtualItem let-item let-index="index">
4963
+ * <div class="px-lg py-md">{{ item.label }}</div>
4964
+ * </ng-template>
4965
+ * <span dgaVirtualLoading>تحميل المزيد…</span>
4966
+ * </dga-virtual-list>
4967
+ * ```
4968
+ */
4969
+ declare class DgaVirtualList {
4970
+ private readonly injector;
4971
+ private readonly viewportRef;
4972
+ /** Projected item template (`ng-template dgaVirtualItem`). */
4973
+ readonly itemDef: _angular_core.Signal<DgaVirtualItem<any> | undefined>;
4974
+ /** Full data set (only the visible window is rendered). */
4975
+ readonly items: _angular_core.InputSignal<unknown[]>;
4976
+ /** Fixed row height in pixels. */
4977
+ readonly itemHeight: _angular_core.InputSignalWithTransform<number, unknown>;
4978
+ /** Extra rows above/below the viewport. */
4979
+ readonly overscan: _angular_core.InputSignalWithTransform<number, unknown>;
4980
+ /** CSS height of the scroll viewport. */
4981
+ readonly height: _angular_core.InputSignal<string>;
4982
+ /**
4983
+ * When set, track rows by `item[trackByKey]` (object id field).
4984
+ * Otherwise track by index.
4985
+ */
4986
+ readonly trackByKey: _angular_core.InputSignal<string | undefined>;
4987
+ /** Show the loading footer (infinite scroll). */
4988
+ readonly loadingMore: _angular_core.InputSignalWithTransform<boolean, unknown>;
4989
+ /** Fires when the user scrolls near the bottom. */
4990
+ readonly scrolledToEnd: _angular_core.OutputEmitterRef<void>;
4991
+ private readonly scrollTop;
4992
+ private readonly viewportHeight;
4993
+ private endEmittedForLength;
4994
+ readonly totalHeight: _angular_core.Signal<number>;
4995
+ readonly startIndex: _angular_core.Signal<number>;
4996
+ readonly endIndex: _angular_core.Signal<number>;
4997
+ readonly offsetY: _angular_core.Signal<number>;
4998
+ readonly visibleRows: _angular_core.Signal<VisibleRow[]>;
4999
+ constructor();
5000
+ onScroll(): void;
5001
+ private checkScrolledToEnd;
5002
+ private trackOf;
5003
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaVirtualList, never>;
5004
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaVirtualList, "dga-virtual-list", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "itemHeight": { "alias": "itemHeight"; "required": false; "isSignal": true; }; "overscan": { "alias": "overscan"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "trackByKey": { "alias": "trackByKey"; "required": false; "isSignal": true; }; "loadingMore": { "alias": "loadingMore"; "required": false; "isSignal": true; }; }, { "scrolledToEnd": "scrolledToEnd"; }, ["itemDef"], ["[dgaVirtualLoading]"], true, never>;
3584
5005
  }
3585
5006
 
3586
5007
  interface DgaExportColumn {
@@ -3658,6 +5079,8 @@ declare class DgaCarouselSlideDirective {
3658
5079
  declare class DgaCarousel {
3659
5080
  private readonly destroyRef;
3660
5081
  private readonly host;
5082
+ private readonly swipe;
5083
+ private drag;
3661
5084
  private readonly track;
3662
5085
  private readonly projected;
3663
5086
  /** Simple title/body slides (gallery). When non-empty, enables simple mode. */
@@ -3708,6 +5131,13 @@ declare class DgaCarousel {
3708
5131
  prevPage(): void;
3709
5132
  nextPage(): void;
3710
5133
  onTrackScroll(): void;
5134
+ onSimplePointerDown(event: PointerEvent): void;
5135
+ onSimplePointerMove(event: PointerEvent): void;
5136
+ onSimplePointerUp(event: PointerEvent): void;
5137
+ onSimplePointerCancel(event: PointerEvent): void;
5138
+ onTrackPointerDown(event: PointerEvent): void;
5139
+ onTrackPointerMove(event: PointerEvent): void;
5140
+ onTrackPointerUp(event: PointerEvent): void;
3711
5141
  private refreshMetrics;
3712
5142
  private resolvePerView;
3713
5143
  private pageScrollAmount;
@@ -3719,176 +5149,6 @@ declare class DgaCarousel {
3719
5149
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaCarousel, "dga-carousel", never, { "slides": { "alias": "slides"; "required": false; "isSignal": true; }; "index": { "alias": "index"; "required": false; "isSignal": true; }; "slidesMax": { "alias": "slidesMax"; "required": false; "isSignal": true; }; "slidesMid": { "alias": "slidesMid"; "required": false; "isSignal": true; }; "slidesMin": { "alias": "slidesMin"; "required": false; "isSignal": true; }; "peek": { "alias": "peek"; "required": false; "isSignal": true; }; "gap": { "alias": "gap"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "prevLabel": { "alias": "prevLabel"; "required": false; "isSignal": true; }; "nextLabel": { "alias": "nextLabel"; "required": false; "isSignal": true; }; "dotsLabel": { "alias": "dotsLabel"; "required": false; "isSignal": true; }; "emptyLabel": { "alias": "emptyLabel"; "required": false; "isSignal": true; }; }, { "index": "indexChange"; }, ["projected"], ["*"], true, never>;
3720
5150
  }
3721
5151
 
3722
- type DgaChartType = 'bar' | 'line' | 'pie' | 'donut';
3723
- /** Backward-compatible single-series point: `{ label, value }`. */
3724
- interface DgaChartPoint {
3725
- label: string;
3726
- value: number;
3727
- }
3728
- /** Multi-series data: one named series of values, aligned with `labels()`. */
3729
- interface DgaChartDataset {
3730
- name: string;
3731
- data: number[];
3732
- }
3733
- interface DgaChartBarSlot {
3734
- seriesIndex: number;
3735
- categoryIndex: number;
3736
- x: number;
3737
- y: number;
3738
- w: number;
3739
- h: number;
3740
- value: number;
3741
- color: string;
3742
- name: string;
3743
- category: string;
3744
- }
3745
- interface DgaChartLinePoint {
3746
- x: number;
3747
- y: number;
3748
- value: number;
3749
- category: string;
3750
- }
3751
- interface DgaChartLine {
3752
- name: string;
3753
- color: string;
3754
- points: DgaChartLinePoint[];
3755
- linePath: string;
3756
- areaPath: string;
3757
- }
3758
- interface DgaChartLegendItem {
3759
- name: string;
3760
- color: string;
3761
- value: number | null;
3762
- }
3763
- interface DgaChartTooltip {
3764
- x: number;
3765
- y: number;
3766
- title: string;
3767
- items: {
3768
- name: string;
3769
- color: string;
3770
- value: number;
3771
- }[];
3772
- }
3773
- declare class DgaChart {
3774
- readonly type: _angular_core.InputSignal<DgaChartType>;
3775
- /** BC single-series input: `[{ label, value }]`. */
3776
- readonly series: _angular_core.InputSignal<DgaChartPoint[]>;
3777
- /** Category names shared by all `datasets()`. */
3778
- readonly labels: _angular_core.InputSignal<string[]>;
3779
- /** Preferred multi-series input for bar/line. */
3780
- readonly datasets: _angular_core.InputSignal<DgaChartDataset[]>;
3781
- /** Shown for pie/donut and multi-series bar/line. Set `false` to force-hide. */
3782
- readonly legend: _angular_core.InputSignalWithTransform<boolean, unknown>;
3783
- readonly tooltip: _angular_core.InputSignalWithTransform<boolean, unknown>;
3784
- readonly grid: _angular_core.InputSignalWithTransform<boolean, unknown>;
3785
- readonly stacked: _angular_core.InputSignalWithTransform<boolean, unknown>;
3786
- readonly smooth: _angular_core.InputSignalWithTransform<boolean, unknown>;
3787
- readonly area: _angular_core.InputSignalWithTransform<boolean, unknown>;
3788
- readonly dots: _angular_core.InputSignalWithTransform<boolean, unknown>;
3789
- /** Overrides the `--dga-chart-color-1..6` token cycle. */
3790
- readonly colors: _angular_core.InputSignal<string[]>;
3791
- /** Label for the value row in pie/donut tooltips. Default: `'القيمة'`. */
3792
- readonly tooltipValueLabel: _angular_core.InputSignal<string>;
3793
- readonly height: _angular_core.InputSignal<number>;
3794
- readonly label: _angular_core.InputSignal<string>;
3795
- /** Fixed drawing width; scales via CSS `w-full`. */
3796
- readonly width = 400;
3797
- readonly pieSize = 180;
3798
- readonly pad: {
3799
- t: number;
3800
- r: number;
3801
- b: number;
3802
- l: number;
3803
- };
3804
- private readonly hiddenNames;
3805
- readonly hiddenSeries: _angular_core.Signal<Set<string>>;
3806
- readonly hoveredCategoryIndex: _angular_core.WritableSignal<number | null>;
3807
- readonly hoveredSlice: _angular_core.WritableSignal<{
3808
- index: number;
3809
- label: string;
3810
- value: number;
3811
- } | null>;
3812
- readonly isPieType: _angular_core.Signal<boolean>;
3813
- /** Category labels: explicit `labels()`, else derived from `datasets()` length, else BC `series()` labels. */
3814
- readonly categories: _angular_core.Signal<string[]>;
3815
- /** Normalized series: `datasets()` when present, else one series built from BC `series()`. */
3816
- readonly seriesList: _angular_core.Signal<DgaChartDataset[]>;
3817
- readonly visibleSeriesList: _angular_core.Signal<DgaChartDataset[]>;
3818
- /** Points feeding pie/donut: BC `series()`, else first dataset paired with `labels()`. */
3819
- readonly piePoints: _angular_core.Signal<DgaChartPoint[]>;
3820
- readonly visiblePiePoints: _angular_core.Signal<DgaChartPoint[]>;
3821
- readonly showLegend: _angular_core.Signal<boolean>;
3822
- readonly legendItems: _angular_core.Signal<DgaChartLegendItem[]>;
3823
- colorFor(index: number): string;
3824
- toggleSeries(name: string): void;
3825
- readonly ariaLabel: _angular_core.Signal<string>;
3826
- readonly plot: _angular_core.Signal<{
3827
- x: number;
3828
- y: number;
3829
- w: number;
3830
- h: number;
3831
- }>;
3832
- readonly gridYs: _angular_core.Signal<number[]>;
3833
- readonly maxValue: _angular_core.Signal<number>;
3834
- /** Layout for one group (category) slot shared by bars and the hover hit-rect. */
3835
- private readonly groupLayout;
3836
- readonly categoryTicks: _angular_core.Signal<{
3837
- index: number;
3838
- category: string;
3839
- x: number;
3840
- hitX: number;
3841
- hitW: number;
3842
- }[]>;
3843
- readonly bars: _angular_core.Signal<DgaChartBarSlot[]>;
3844
- readonly visibleLines: _angular_core.Signal<DgaChartLine[]>;
3845
- private straightPathD;
3846
- /** Piecewise cubic Bezier through the points (Catmull-Rom style tangents). */
3847
- private smoothPathD;
3848
- private areaPathD;
3849
- readonly pieSlices: _angular_core.Signal<{
3850
- index: number;
3851
- label: string;
3852
- value: number;
3853
- color: string;
3854
- d: string;
3855
- midX: number;
3856
- midY: number;
3857
- }[]>;
3858
- onCategoryEnter(index: number): void;
3859
- onCategoryLeave(): void;
3860
- onSliceEnter(index: number, slice: {
3861
- label: string;
3862
- value: number;
3863
- }): void;
3864
- onSliceLeave(): void;
3865
- categoryAriaLabel(index: number): string;
3866
- readonly categoryTooltip: _angular_core.Signal<DgaChartTooltip | null>;
3867
- readonly sliceTooltip: _angular_core.Signal<DgaChartTooltip | null>;
3868
- formatValue(value: number): string;
3869
- pieTooltipStyle(tip: DgaChartTooltip): Record<string, string>;
3870
- plotTooltipStyle(tip: DgaChartTooltip): Record<string, string>;
3871
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaChart, never>;
3872
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<DgaChart, "dga-chart", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "series": { "alias": "series"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "datasets": { "alias": "datasets"; "required": false; "isSignal": true; }; "legend": { "alias": "legend"; "required": false; "isSignal": true; }; "tooltip": { "alias": "tooltip"; "required": false; "isSignal": true; }; "grid": { "alias": "grid"; "required": false; "isSignal": true; }; "stacked": { "alias": "stacked"; "required": false; "isSignal": true; }; "smooth": { "alias": "smooth"; "required": false; "isSignal": true; }; "area": { "alias": "area"; "required": false; "isSignal": true; }; "dots": { "alias": "dots"; "required": false; "isSignal": true; }; "colors": { "alias": "colors"; "required": false; "isSignal": true; }; "tooltipValueLabel": { "alias": "tooltipValueLabel"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3873
- }
3874
-
3875
- interface DgaSaudiCity {
3876
- id: number;
3877
- region: string;
3878
- regionAr: string;
3879
- name: string;
3880
- nameAr: string;
3881
- }
3882
- /** Bilingual Saudi cities across all 13 administrative regions. */
3883
- declare const DGA_SAUDI_CITIES: readonly DgaSaudiCity[];
3884
- /** Group cities by English region name. */
3885
- declare function dgaGroupSaudiCitiesByRegion(cities?: readonly DgaSaudiCity[]): Record<string, DgaSaudiCity[]>;
3886
- /** Autocomplete-ready options (Arabic labels by default). */
3887
- declare function dgaSaudiCityOptions(locale?: string, cities?: readonly DgaSaudiCity[]): {
3888
- label: string;
3889
- value: string;
3890
- }[];
3891
-
3892
5152
  declare function dgaResolveAppHref(href: string, baseHref?: string): string;
3893
5153
  /**
3894
5154
  * Safe href for config-driven links (CMS / schema).
@@ -3901,5 +5161,5 @@ declare function dgaSafeCssColor(value: string | null | undefined, fallback?: st
3901
5161
  /** Join truthy class names. */
3902
5162
  declare function dgaCx(...parts: Array<string | false | null | undefined>): string;
3903
5163
 
3904
- 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, dgaCurrentLocale, dgaCx, dgaFormStatusFromInvalid, dgaGroupSaudiCitiesByRegion, dgaIsArabic, dgaIsRtl, dgaNormalizeTime, dgaProvideValueAccessor, dgaResolveAppHref, dgaResolveLocalized, dgaResolveVideoSource, dgaSafeCssColor, dgaSafeHref, dgaSaudiCityOptions, dgaUiLocale };
3905
- 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, DgaLocalizedString, DgaMenuItem, DgaMetricAppearance, DgaMetricTrend, DgaModalAnimation, DgaModalSize, DgaMultiselectOption, DgaNativeSelectSize, DgaNavRailActiveStyle, DgaNavRailAppearance, DgaNavRailItem, DgaNavRailPosition, DgaNavRailSize, DgaPageFeedbackAgreementLink, DgaPageFeedbackAnswer, DgaPageFeedbackOption, DgaPageFeedbackPhase, DgaPageFeedbackSubmit, DgaPageHeroTone, DgaPageTransitionName, DgaPhoneCountry, DgaPhoneCountryName, 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 };
5164
+ export { DGA_GREGORIAN_MONTHS, DGA_HIJRI_MONTHS, DGA_IBAN_COUNTRY, DGA_IBAN_LENGTH, DGA_ICON_NAMES, DGA_ICON_OVERRIDES, DGA_LOGICAL_ICON_NAMES, DGA_PHONE_COUNTRIES, DGA_RIYAL_SVG_PATH, DGA_RIYAL_VIEWBOX, DGA_WEEKDAYS, DgaAccordion, DgaAccordionItem, DgaAlert, DgaAnnouncementBar, DgaAppShell, DgaAuthCard, DgaAutocomplete, DgaAvatar, DgaBadge, DgaBarcode, DgaBottomSheet, DgaBreadcrumb, DgaButton, DgaCard, DgaCardDef, DgaCardMedia, DgaCarousel, DgaCarouselSlideDirective, DgaCellDef, DgaCheckbox, DgaChip, DgaChipInput, DgaChoiceGroup, DgaClamp, DgaCode, DgaCommand, DgaConfirm, DgaContentSwitcher, DgaContentSwitcherPanel, DgaContextMenu, DgaContextMenuTrigger, DgaCopy, DgaDescriptionList, DgaDialog, DgaDivider, DgaDrawer, DgaDualNav, DgaEmpty, DgaEventCalendar, DgaExpandDef, DgaExpandable, DgaExport, DgaExportToolbar, DgaFaq, DgaFeedback, DgaField, DgaFilePreview, DgaFilterBar, DgaFooter, DgaFormControl, DgaFormEnd, DgaFormStart, DgaGrid, DgaHero, DgaIbanInput, DgaIcon, DgaIconBadge, DgaIconFontService, DgaIconRegistry, DgaImagePopup, DgaInfoList, DgaInput, DgaKbd, DgaKbdGroup, DgaLabel, DgaLink, DgaList, DgaLocaleToggle, DgaLogoTile, DgaMapEmbed, DgaMenu, DgaMetric, DgaModal, DgaMultiselect, DgaNationalId, DgaNativeSelect, DgaNavRail, DgaNotificationInbox, DgaNumber, DgaNumberInput, DgaOffline, DgaOtp, DgaPageFeedback, DgaPageHero, DgaPagination, DgaPassword, DgaPersona, DgaPhoneInput, DgaPopover, DgaPreloader, DgaPrint, DgaProgress, DgaQr, DgaQuote, DgaRadio, DgaRating, DgaRichText, DgaRiyal, DgaRowActionsDef, DgaScrollTop, DgaSearchBar, DgaSection, DgaSelect, DgaShare, DgaSideInfo, DgaSideNav, DgaSignaturePad, DgaSkeleton, DgaSkipLink, DgaSlider, DgaSpinner, DgaStatStrip, DgaStepper, DgaSwitch, DgaTab, DgaTable, DgaTableColumnPicker, DgaTabs, DgaThemeToggle, DgaTimePicker, DgaTimeline, DgaToast, DgaToastOutlet, DgaToastService, DgaToc, DgaToolbar, DgaTooltip, DgaTopBar, DgaTour, DgaTree, DgaTreeSelect, DgaUpload, DgaVideoPlayer, DgaVirtualItem, DgaVirtualList, DgaWriting, dgaAddMonths, dgaClampDate, dgaCoerceDate, dgaCompareDays, dgaCurrentLocale, dgaCx, dgaDaysInMonth, dgaDetectFilePreviewKind, dgaEncodeBarcode, dgaEncodeQr, dgaFilterTree, dgaFindTreeItem, dgaFlattenTree, dgaFormStatusFromInvalid, dgaFormatDate, dgaFormatIban, dgaFormatNationalId, dgaGetCalendarParts, dgaIsAllowedMapEmbedUrl, dgaIsArabic, dgaIsRtl, dgaIsValidIban, dgaIsValidNationalId, dgaModeFromFormat, dgaMonthNames, dgaMonthStartWeekday, dgaNationalIdKind, dgaNormalizeIban, dgaNormalizeNationalId, dgaNormalizeTime, dgaParseDate, dgaPartsToDate, dgaPasswordStrength, dgaProvideValueAccessor, dgaResolveAppHref, dgaResolveLocalized, dgaResolveVideoSource, dgaSafeCssColor, dgaSafeHref, dgaSameDay, dgaTodayUtc, dgaTreeAncestors, dgaUiLocale, dgaVisibleTreeNodes, provideDgaIcons };
5165
+ export type { DgaAccordionSection, DgaAlertDisplay, DgaAlertVariant, DgaAnnouncementActionVariant, DgaAnnouncementAlign, DgaAnnouncementDensity, DgaAnnouncementElevation, DgaAnnouncementPersist, DgaAnnouncementTone, DgaAppShellAppearance, DgaAutocompleteOption, DgaAvatarSize, DgaBadgeSize, DgaBadgeVariant, DgaBarcodeFormat, DgaBarcodeMatrix, DgaBottomSheetSnap, DgaBreadcrumbItem, DgaBreadcrumbSeparator, DgaButtonEffect, DgaButtonSize, DgaButtonVariant, DgaCalendar, DgaCalendarEvent, DgaCalendarParts, DgaCardActionsAlign, DgaCardAppearance, DgaCardBadge, DgaCardBorder, DgaCardPadding, DgaCardShadow, DgaCarouselSlide, DgaCellContext, DgaCheckboxSize, DgaChipVariant, DgaChoiceLayout, DgaCommandAppearance, DgaCommandGroup, DgaCommandItem, DgaConfirmTone, DgaContentSwitcherItem, DgaContextMenuItem, DgaContextMenuItemType, DgaCurrency, DgaDateCalendar, DgaDateLocale, DgaDatePickerMode, DgaDescriptionItem, DgaDescriptionLayout, DgaDialogSize, DgaDividerOrientation, DgaDrawerSide, DgaDualNavCategory, DgaDualNavSection, DgaEmptyAppearance, DgaExportColumn, DgaExportData, DgaExportScope, DgaFaqItem, DgaFeedbackSubmit, DgaFilePreviewKind, DgaFilePreviewPresentation, DgaFilterItem, DgaFooterAppearance, DgaFooterColumn, DgaFooterIconGroup, DgaFooterIconLink, DgaFooterLink, DgaFooterLogo, DgaFormControlSize, DgaFormStatus, DgaGridCols, DgaGridGap, DgaHeroAppearance, DgaHeroImageMask, DgaHeroOverlayTone, DgaHeroSlide, DgaHeroTransition, DgaIconBadgeAppearance, DgaIconBadgeSize, DgaIconName, DgaIconNameInput, DgaIconSize, DgaIconTone, DgaImagePopupAnimation, DgaImagePopupImage, DgaImagePopupImageTransition, DgaImagePopupSource, DgaInfoListItem, DgaInputSize, DgaLinkVariant, DgaLocalizedString, DgaMapEmbedAspect, DgaMenuItem, DgaMetricAppearance, DgaMetricTrend, DgaModalAnimation, DgaModalSize, DgaMultiselectOption, DgaNationalIdKind, DgaNativeSelectSize, DgaNavRailActiveStyle, DgaNavRailAppearance, DgaNavRailItem, DgaNavRailPosition, DgaNavRailSize, DgaNotificationItem, DgaOfflineMode, DgaPageFeedbackAgreementLink, DgaPageFeedbackAnswer, DgaPageFeedbackOption, DgaPageFeedbackPhase, DgaPageFeedbackSubmit, DgaPageHeroTone, DgaPasswordStrength, DgaPasswordStrengthResult, DgaPhoneCountry, DgaPhoneCountryName, DgaPopoverPlacement, DgaPreloaderPersist, DgaProgressAppearance, DgaProgressSize, DgaProgressTone, DgaQrAnimate, DgaQrErrorCorrection, DgaQrMatrix, DgaQrSize, DgaQrSizeToken, DgaQrView, DgaRadioSize, DgaRatingSize, DgaRiyalAppearance, DgaRiyalSize, DgaRiyalTone, DgaScrollTopPosition, DgaSearchBarSize, DgaSectionTone, DgaSectionWidth, DgaSelectOpenMode, DgaSelectOption, DgaSelectSize, DgaShareAppearance, DgaSideInfoItem, DgaSideNavGroup, DgaSideNavItem, DgaSkeletonAnimation, DgaSkeletonRadius, DgaSkeletonShape, DgaSkeletonSize, DgaSliderSize, DgaSortDir, DgaSpinnerSize, DgaSpinnerTone, DgaStampNotice, DgaStatStripItem, DgaStatStripTrend, DgaStep, DgaStepStatus, DgaSwitchSize, DgaTabItem, DgaTableColumn, DgaTableDensity, DgaTableFilterEvent, DgaTablePageEvent, DgaTableResolvedView, DgaTableSortEvent, DgaTableViewMode, DgaThemeToggleSurface, DgaTimeFormat, DgaTimePickerFormat, DgaTimePickerSize, DgaTimelineItem, DgaToastAnimation, DgaToastLocation, DgaToastRequest, DgaToastShowOptions, DgaToastVariant, DgaTocItem, DgaTooltipPlacement, DgaTooltipVariant, DgaTourPersist, DgaTourPlacement, DgaTourStep, DgaTreeItem, DgaTreeSelectSize, DgaUploadAppearance, DgaUploadFile, DgaUploadRejectReason, DgaUploadRejection, DgaVideoProvider, DgaVideoRatio, DgaVideoSourceInfo, DgaVirtualItemContext, DgaWritingEffect };