@a.nemreen/dga-ui 0.3.13 → 0.3.14

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@a.nemreen/dga-ui",
3
- "version": "0.3.13",
3
+ "version": "0.3.14",
4
4
  "description": "DGA Angular UI library — standalone forms, overlays, navigation, and portal shell with RTL-first Tailwind styling",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -67,6 +67,14 @@
67
67
  "types": "./types/a.nemreen-dga-ui.d.ts",
68
68
  "default": "./fesm2022/a.nemreen-dga-ui.mjs"
69
69
  },
70
+ "./chart": {
71
+ "types": "./types/a.nemreen-dga-ui-chart.d.ts",
72
+ "default": "./fesm2022/a.nemreen-dga-ui-chart.mjs"
73
+ },
74
+ "./chatbot": {
75
+ "types": "./types/a.nemreen-dga-ui-chatbot.d.ts",
76
+ "default": "./fesm2022/a.nemreen-dga-ui-chatbot.mjs"
77
+ },
70
78
  "./cookies": {
71
79
  "types": "./types/a.nemreen-dga-ui-cookies.d.ts",
72
80
  "default": "./fesm2022/a.nemreen-dga-ui-cookies.mjs"
@@ -78,6 +86,14 @@
78
86
  "./header": {
79
87
  "types": "./types/a.nemreen-dga-ui-header.d.ts",
80
88
  "default": "./fesm2022/a.nemreen-dga-ui-header.mjs"
89
+ },
90
+ "./page-transition": {
91
+ "types": "./types/a.nemreen-dga-ui-page-transition.d.ts",
92
+ "default": "./fesm2022/a.nemreen-dga-ui-page-transition.mjs"
93
+ },
94
+ "./saudi-cities": {
95
+ "types": "./types/a.nemreen-dga-ui-saudi-cities.d.ts",
96
+ "default": "./fesm2022/a.nemreen-dga-ui-saudi-cities.mjs"
81
97
  }
82
98
  },
83
99
  "type": "module"
@@ -0,0 +1,157 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type DgaChartType = 'bar' | 'line' | 'pie' | 'donut';
4
+ /** Backward-compatible single-series point: `{ label, value }`. */
5
+ interface DgaChartPoint {
6
+ label: string;
7
+ value: number;
8
+ }
9
+ /** Multi-series data: one named series of values, aligned with `labels()`. */
10
+ interface DgaChartDataset {
11
+ name: string;
12
+ data: number[];
13
+ }
14
+ interface DgaChartBarSlot {
15
+ seriesIndex: number;
16
+ categoryIndex: number;
17
+ x: number;
18
+ y: number;
19
+ w: number;
20
+ h: number;
21
+ value: number;
22
+ color: string;
23
+ name: string;
24
+ category: string;
25
+ }
26
+ interface DgaChartLinePoint {
27
+ x: number;
28
+ y: number;
29
+ value: number;
30
+ category: string;
31
+ }
32
+ interface DgaChartLine {
33
+ name: string;
34
+ color: string;
35
+ points: DgaChartLinePoint[];
36
+ linePath: string;
37
+ areaPath: string;
38
+ }
39
+ interface DgaChartLegendItem {
40
+ name: string;
41
+ color: string;
42
+ value: number | null;
43
+ }
44
+ interface DgaChartTooltip {
45
+ x: number;
46
+ y: number;
47
+ title: string;
48
+ items: {
49
+ name: string;
50
+ color: string;
51
+ value: number;
52
+ }[];
53
+ }
54
+ declare class DgaChart {
55
+ readonly type: _angular_core.InputSignal<DgaChartType>;
56
+ /** BC single-series input: `[{ label, value }]`. */
57
+ readonly series: _angular_core.InputSignal<DgaChartPoint[]>;
58
+ /** Category names shared by all `datasets()`. */
59
+ readonly labels: _angular_core.InputSignal<string[]>;
60
+ /** Preferred multi-series input for bar/line. */
61
+ readonly datasets: _angular_core.InputSignal<DgaChartDataset[]>;
62
+ /** Shown for pie/donut and multi-series bar/line. Set `false` to force-hide. */
63
+ readonly legend: _angular_core.InputSignalWithTransform<boolean, unknown>;
64
+ readonly tooltip: _angular_core.InputSignalWithTransform<boolean, unknown>;
65
+ readonly grid: _angular_core.InputSignalWithTransform<boolean, unknown>;
66
+ readonly stacked: _angular_core.InputSignalWithTransform<boolean, unknown>;
67
+ readonly smooth: _angular_core.InputSignalWithTransform<boolean, unknown>;
68
+ readonly area: _angular_core.InputSignalWithTransform<boolean, unknown>;
69
+ readonly dots: _angular_core.InputSignalWithTransform<boolean, unknown>;
70
+ /** Overrides the `--dga-chart-color-1..6` token cycle. */
71
+ readonly colors: _angular_core.InputSignal<string[]>;
72
+ /** Label for the value row in pie/donut tooltips. Default: `'القيمة'`. */
73
+ readonly tooltipValueLabel: _angular_core.InputSignal<string>;
74
+ readonly height: _angular_core.InputSignal<number>;
75
+ readonly label: _angular_core.InputSignal<string>;
76
+ /** Fixed drawing width; scales via CSS `w-full`. */
77
+ readonly width = 400;
78
+ readonly pieSize = 180;
79
+ readonly pad: {
80
+ t: number;
81
+ r: number;
82
+ b: number;
83
+ l: number;
84
+ };
85
+ private readonly hiddenNames;
86
+ readonly hiddenSeries: _angular_core.Signal<Set<string>>;
87
+ readonly hoveredCategoryIndex: _angular_core.WritableSignal<number | null>;
88
+ readonly hoveredSlice: _angular_core.WritableSignal<{
89
+ index: number;
90
+ label: string;
91
+ value: number;
92
+ } | null>;
93
+ readonly isPieType: _angular_core.Signal<boolean>;
94
+ /** Category labels: explicit `labels()`, else derived from `datasets()` length, else BC `series()` labels. */
95
+ readonly categories: _angular_core.Signal<string[]>;
96
+ /** Normalized series: `datasets()` when present, else one series built from BC `series()`. */
97
+ readonly seriesList: _angular_core.Signal<DgaChartDataset[]>;
98
+ readonly visibleSeriesList: _angular_core.Signal<DgaChartDataset[]>;
99
+ /** Points feeding pie/donut: BC `series()`, else first dataset paired with `labels()`. */
100
+ readonly piePoints: _angular_core.Signal<DgaChartPoint[]>;
101
+ readonly visiblePiePoints: _angular_core.Signal<DgaChartPoint[]>;
102
+ readonly showLegend: _angular_core.Signal<boolean>;
103
+ readonly legendItems: _angular_core.Signal<DgaChartLegendItem[]>;
104
+ colorFor(index: number): string;
105
+ toggleSeries(name: string): void;
106
+ readonly ariaLabel: _angular_core.Signal<string>;
107
+ readonly plot: _angular_core.Signal<{
108
+ x: number;
109
+ y: number;
110
+ w: number;
111
+ h: number;
112
+ }>;
113
+ readonly gridYs: _angular_core.Signal<number[]>;
114
+ readonly maxValue: _angular_core.Signal<number>;
115
+ /** Layout for one group (category) slot shared by bars and the hover hit-rect. */
116
+ private readonly groupLayout;
117
+ readonly categoryTicks: _angular_core.Signal<{
118
+ index: number;
119
+ category: string;
120
+ x: number;
121
+ hitX: number;
122
+ hitW: number;
123
+ }[]>;
124
+ readonly bars: _angular_core.Signal<DgaChartBarSlot[]>;
125
+ readonly visibleLines: _angular_core.Signal<DgaChartLine[]>;
126
+ private straightPathD;
127
+ /** Piecewise cubic Bezier through the points (Catmull-Rom style tangents). */
128
+ private smoothPathD;
129
+ private areaPathD;
130
+ readonly pieSlices: _angular_core.Signal<{
131
+ index: number;
132
+ label: string;
133
+ value: number;
134
+ color: string;
135
+ d: string;
136
+ midX: number;
137
+ midY: number;
138
+ }[]>;
139
+ onCategoryEnter(index: number): void;
140
+ onCategoryLeave(): void;
141
+ onSliceEnter(index: number, slice: {
142
+ label: string;
143
+ value: number;
144
+ }): void;
145
+ onSliceLeave(): void;
146
+ categoryAriaLabel(index: number): string;
147
+ readonly categoryTooltip: _angular_core.Signal<DgaChartTooltip | null>;
148
+ readonly sliceTooltip: _angular_core.Signal<DgaChartTooltip | null>;
149
+ formatValue(value: number): string;
150
+ pieTooltipStyle(tip: DgaChartTooltip): Record<string, string>;
151
+ plotTooltipStyle(tip: DgaChartTooltip): Record<string, string>;
152
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaChart, never>;
153
+ 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>;
154
+ }
155
+
156
+ export { DgaChart };
157
+ export type { DgaChartDataset, DgaChartPoint, DgaChartType };
@@ -0,0 +1,102 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ type DgaChatbotPosition = 'end' | 'start' | 'left' | 'right';
4
+ type DgaChatbotAnimation = 'fade' | 'slide' | 'scale' | 'none';
5
+ type DgaChatbotSize = 'sm' | 'md' | 'lg';
6
+ type DgaChatbotFabTone = 'primary' | 'secondary';
7
+ interface DgaChatbotMessage {
8
+ id: string;
9
+ role: 'bot' | 'user';
10
+ text: string;
11
+ }
12
+ /**
13
+ * Floating live-chat launcher + panel. Place once near the app root
14
+ * (beside `dga-scroll-top` / `dga-accessibility`).
15
+ *
16
+ * Use `stack` so FABs share one vertical dock:
17
+ * a11y `0` → chatbot `1` → scroll-top `2`.
18
+ */
19
+ declare class DgaChatbot {
20
+ private readonly destroyRef;
21
+ private readonly injector;
22
+ private readonly composerRef;
23
+ private readonly logRef;
24
+ /** Corner for FAB + panel. `end` / `start` follow reading direction. */
25
+ readonly position: _angular_core.InputSignal<DgaChatbotPosition>;
26
+ /** Panel enter animation. Honors `prefers-reduced-motion`. */
27
+ readonly animation: _angular_core.InputSignal<DgaChatbotAnimation>;
28
+ readonly size: _angular_core.InputSignal<DgaChatbotSize>;
29
+ readonly title: _angular_core.InputSignal<string>;
30
+ readonly subtitle: _angular_core.InputSignal<string>;
31
+ readonly fabLabel: _angular_core.InputSignal<string>;
32
+ readonly placeholder: _angular_core.InputSignal<string>;
33
+ readonly fabIcon: _angular_core.InputSignal<"user" | "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" | "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">;
34
+ /** Prefer a directional arrow so send ≠ chat bubble. */
35
+ readonly sendIcon: _angular_core.InputSignal<"user" | "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" | "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">;
36
+ readonly agentIcon: _angular_core.InputSignal<"user" | "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" | "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">;
37
+ readonly fabTone: _angular_core.InputSignal<DgaChatbotFabTone>;
38
+ /** Dim page behind the panel. */
39
+ readonly overlay: _angular_core.InputSignalWithTransform<boolean, unknown>;
40
+ /** Close when clicking the overlay. */
41
+ readonly overlayClose: _angular_core.InputSignalWithTransform<boolean, unknown>;
42
+ /** Green online dot on the agent avatar. */
43
+ readonly online: _angular_core.InputSignalWithTransform<boolean, unknown>;
44
+ /** Hide launcher while the panel is open (recommended). */
45
+ readonly hideFabWhenOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
46
+ /**
47
+ * 0-based slot in the shared FAB dock (bottom → top).
48
+ * Typical: a11y=0, chatbot=1, scroll-top=2.
49
+ */
50
+ readonly stack: _angular_core.InputSignalWithTransform<number, unknown>;
51
+ /**
52
+ * @deprecated Prefer `stack`. When true and `stack` is unset legacy path —
53
+ * kept for callers; `stack` wins.
54
+ */
55
+ readonly clearFab: _angular_core.InputSignalWithTransform<boolean, unknown>;
56
+ /**
57
+ * Anchor FAB/panel inside a relative parent (gallery / docs preview)
58
+ * instead of the viewport — avoids a second global FAB.
59
+ */
60
+ readonly embedded: _angular_core.InputSignalWithTransform<boolean, unknown>;
61
+ readonly initialMessages: _angular_core.InputSignal<readonly DgaChatbotMessage[]>;
62
+ readonly sent: _angular_core.OutputEmitterRef<string>;
63
+ readonly opened: _angular_core.OutputEmitterRef<void>;
64
+ readonly closed: _angular_core.OutputEmitterRef<void>;
65
+ readonly open: _angular_core.WritableSignal<boolean>;
66
+ readonly draft: _angular_core.WritableSignal<string>;
67
+ readonly messages: _angular_core.WritableSignal<DgaChatbotMessage[]>;
68
+ private readonly seq;
69
+ readonly panelId: string;
70
+ private msgSeq;
71
+ private seeded;
72
+ private prevOverflow;
73
+ readonly copy: _angular_core.Signal<{
74
+ title: string;
75
+ subtitle: string;
76
+ open: string;
77
+ close: string;
78
+ send: string;
79
+ input: string;
80
+ placeholder: string;
81
+ panelLabel: string;
82
+ welcome: string;
83
+ }>;
84
+ readonly fabBottom: _angular_core.Signal<string>;
85
+ readonly fabClasses: _angular_core.Signal<string>;
86
+ readonly panelClasses: _angular_core.Signal<string>;
87
+ constructor();
88
+ private ensureSeed;
89
+ toggle(): void;
90
+ show(): void;
91
+ close(): void;
92
+ onBackdrop(): void;
93
+ onSubmit(event: Event): void;
94
+ private scrollLogToEnd;
95
+ private lockScroll;
96
+ private unlockScroll;
97
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaChatbot, never>;
98
+ 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>;
99
+ }
100
+
101
+ export { DgaChatbot };
102
+ export type { DgaChatbotAnimation, DgaChatbotFabTone, DgaChatbotMessage, DgaChatbotPosition, DgaChatbotSize };
@@ -1,6 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnInit } from '@angular/core';
3
- import { DgaIconName } from '@a.nemreen/dga-ui';
4
3
 
5
4
  /** Stored consent outcome. `custom` = per-category preferences were saved. */
6
5
  type DgaCookieConsent = 'accepted' | 'declined' | 'custom' | null;
@@ -78,7 +77,7 @@ declare class DgaCookies implements OnInit {
78
77
  readonly declineLabel: _angular_core.InputSignal<string>;
79
78
  readonly customizeLabel: _angular_core.InputSignal<string>;
80
79
  readonly saveLabel: _angular_core.InputSignal<string>;
81
- readonly icon: _angular_core.InputSignal<DgaIconName>;
80
+ readonly icon: _angular_core.InputSignal<"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">;
82
81
  /** Google Analytics IDs to disable on decline / when analytics is off. */
83
82
  readonly gaTrackingIds: _angular_core.InputSignal<string | readonly string[]>;
84
83
  /** Consent cookie lifetime in days. */
@@ -0,0 +1,51 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ /** Creative named page transitions for `dga-page-transition`. */
4
+ 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"];
5
+ type DgaPageTransitionName = (typeof DGA_PAGE_TRANSITION_NAMES)[number];
6
+ /**
7
+ * Easy page / content transition wrapper.
8
+ *
9
+ * ```html
10
+ * <dga-page-transition name="fade-up">
11
+ * <router-outlet />
12
+ * </dga-page-transition>
13
+ * ```
14
+ *
15
+ * Triggers: Angular `NavigationEnd`, or a change to `key` (playground / content swap).
16
+ * Progressive enhancement: sets `view-transition-name: dga-page` so apps using
17
+ * `withViewTransitions()` get named snapshot animations. Keyframe enter runs as fallback.
18
+ * Honors `prefers-reduced-motion` and DGA a11y `reduce-motion`.
19
+ */
20
+ declare class DgaPageTransition {
21
+ private readonly host;
22
+ private readonly doc;
23
+ private readonly destroyRef;
24
+ private readonly router;
25
+ /** Named creative transition. Unknown values resolve to `none`. */
26
+ readonly name: _angular_core.InputSignal<string>;
27
+ /** Duration in milliseconds (also drives `--dga-pt-ms`). */
28
+ readonly duration: _angular_core.InputSignalWithTransform<number, unknown>;
29
+ /** Skip all motion. */
30
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
31
+ /**
32
+ * Bump this to re-play the enter animation (content swaps / gallery playground).
33
+ * For View Transition snapshots, wrap the key update in `document.startViewTransition`.
34
+ */
35
+ readonly key: _angular_core.InputSignal<string | number | null>;
36
+ readonly phase: _angular_core.WritableSignal<"idle" | "enter">;
37
+ readonly resolvedName: _angular_core.Signal<"fade-up" | "slide-stack" | "curtain-wipe" | "zoom-blur" | "book-flip" | "circle-reveal" | "shared-axis" | "glitch" | "iris-open" | "split-reveal" | "stagger-cascade" | "liquid-swipe" | "push-depth" | "skew-slide" | "bounce-in" | "film-strip" | "portal-warp" | "ripple-expand" | "origami-fold" | "swipe-cards" | "none">;
38
+ readonly durationCss: _angular_core.Signal<string>;
39
+ private htmlAttr;
40
+ private keyPrimed;
41
+ constructor();
42
+ /** Re-trigger the enter animation (e.g. from a Play control). */
43
+ play(): void;
44
+ protected onAnimationEnd(event: AnimationEvent): void;
45
+ private shouldReduceMotion;
46
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DgaPageTransition, never>;
47
+ 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>;
48
+ }
49
+
50
+ export { DGA_PAGE_TRANSITION_NAMES, DgaPageTransition };
51
+ export type { DgaPageTransitionName };
@@ -0,0 +1,19 @@
1
+ interface DgaSaudiCity {
2
+ id: number;
3
+ region: string;
4
+ regionAr: string;
5
+ name: string;
6
+ nameAr: string;
7
+ }
8
+ /** Bilingual Saudi cities across all 13 administrative regions. */
9
+ declare const DGA_SAUDI_CITIES: readonly DgaSaudiCity[];
10
+ /** Group cities by English region name. */
11
+ declare function dgaGroupSaudiCitiesByRegion(cities?: readonly DgaSaudiCity[]): Record<string, DgaSaudiCity[]>;
12
+ /** Autocomplete-ready options (Arabic labels by default). */
13
+ declare function dgaSaudiCityOptions(locale?: string, cities?: readonly DgaSaudiCity[]): {
14
+ label: string;
15
+ value: string;
16
+ }[];
17
+
18
+ export { DGA_SAUDI_CITIES, dgaGroupSaudiCitiesByRegion, dgaSaudiCityOptions };
19
+ export type { DgaSaudiCity };