voyage-lib 0.0.1

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.
@@ -0,0 +1,527 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnDestroy, PipeTransform, InjectionToken } from '@angular/core';
3
+ import { HttpHeaders, HttpParams } from '@angular/common/http';
4
+ import { Observable } from 'rxjs';
5
+
6
+ type SnackbarType = 'success' | 'error' | 'warning' | 'info';
7
+ interface SnackbarConfig {
8
+ /** Main notification message. */
9
+ message: string;
10
+ /** Visual variant. Maps to theme semantic colors. Defaults to 'info'. */
11
+ type?: SnackbarType;
12
+ /** Optional bold heading above the message. */
13
+ title?: string;
14
+ /** Auto-dismiss delay in ms. Defaults to 4000. Pass 0 for persistent. */
15
+ duration?: number;
16
+ /** Show the × close button. Defaults to true. */
17
+ dismissible?: boolean;
18
+ /** Optional inline action button. */
19
+ action?: {
20
+ label: string;
21
+ handler: () => void;
22
+ };
23
+ }
24
+ interface SnackbarItem {
25
+ id: string;
26
+ message: string;
27
+ type: SnackbarType;
28
+ title: string;
29
+ duration: number;
30
+ dismissible: boolean;
31
+ action?: SnackbarConfig['action'];
32
+ /** True while the exit animation is running. */
33
+ exiting: boolean;
34
+ }
35
+
36
+ declare class SnackbarService {
37
+ readonly items: _angular_core.WritableSignal<SnackbarItem[]>;
38
+ show(config: SnackbarConfig): string;
39
+ dismiss(id: string): void;
40
+ success(message: string, config?: Omit<SnackbarConfig, 'message' | 'type'>): string;
41
+ error(message: string, config?: Omit<SnackbarConfig, 'message' | 'type'>): string;
42
+ warning(message: string, config?: Omit<SnackbarConfig, 'message' | 'type'>): string;
43
+ info(message: string, config?: Omit<SnackbarConfig, 'message' | 'type'>): string;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SnackbarService, never>;
45
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SnackbarService>;
46
+ }
47
+
48
+ declare class SnackbarComponent {
49
+ protected readonly svc: SnackbarService;
50
+ protected handleAction(item: SnackbarItem): void;
51
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SnackbarComponent, never>;
52
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SnackbarComponent, "vl-snackbar", never, {}, {}, never, never, true, never>;
53
+ }
54
+
55
+ /**
56
+ * User avatar — shows image when available, falls back to initials.
57
+ *
58
+ * Usage:
59
+ * <vl-avatar name="Pranesh T" />
60
+ * <vl-avatar name="Pranesh T" [src]="user.photoUrl" size="lg" />
61
+ */
62
+ declare class AvatarComponent {
63
+ name: _angular_core.InputSignal<string>;
64
+ src: _angular_core.InputSignal<string | null>;
65
+ size: _angular_core.InputSignal<"xs" | "sm" | "md" | "lg" | "xl">;
66
+ protected imgError: boolean;
67
+ protected initials: _angular_core.Signal<string>;
68
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<AvatarComponent, never>;
69
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AvatarComponent, "vl-avatar", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "src": { "alias": "src"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
70
+ }
71
+
72
+ type BadgeVariant = 'planning' | 'ongoing' | 'completed' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';
73
+
74
+ /**
75
+ * Colored pill badge with optional leading dot.
76
+ *
77
+ * Usage:
78
+ * <vl-badge variant="ongoing">Ongoing</vl-badge>
79
+ * <vl-badge [dot]="true" variant="planning">Planning</vl-badge>
80
+ * <vl-badge [color]="categoryColor" [bgColor]="categoryBg">Food</vl-badge>
81
+ */
82
+ declare class BadgeComponent {
83
+ variant: _angular_core.InputSignal<BadgeVariant>;
84
+ dot: _angular_core.InputSignal<boolean>;
85
+ /** Override color (text + dot). Takes precedence over variant. */
86
+ color: _angular_core.InputSignal<string>;
87
+ /** Override background color. Takes precedence over variant. */
88
+ bgColor: _angular_core.InputSignal<string>;
89
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BadgeComponent, never>;
90
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BadgeComponent, "vl-badge", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "dot": { "alias": "dot"; "required": false; "isSignal": true; }; "color": { "alias": "color"; "required": false; "isSignal": true; }; "bgColor": { "alias": "bgColor"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
91
+ }
92
+
93
+ type ButtonVariant = 'primary' | 'secondary' | 'danger' | 'ghost' | 'outline';
94
+ type ButtonSize = 'sm' | 'md' | 'lg';
95
+
96
+ declare class ButtonComponent {
97
+ variant: _angular_core.InputSignal<ButtonVariant>;
98
+ size: _angular_core.InputSignal<ButtonSize>;
99
+ loading: _angular_core.InputSignal<boolean>;
100
+ disabled: _angular_core.InputSignal<boolean>;
101
+ protected variantClass(): string;
102
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ButtonComponent, never>;
103
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ButtonComponent, "vl-button", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
104
+ }
105
+
106
+ /**
107
+ * Standard card wrapper. Optionally includes a section header.
108
+ *
109
+ * Usage:
110
+ * <vl-card>content</vl-card>
111
+ * <vl-card sectionTitle="Basic Info">content</vl-card>
112
+ * <vl-card [hover]="true" padding="none">content</vl-card>
113
+ */
114
+ declare class CardComponent {
115
+ padding: _angular_core.InputSignal<"sm" | "md" | "lg" | "none">;
116
+ hover: _angular_core.InputSignal<boolean>;
117
+ sectionTitle: _angular_core.InputSignal<string>;
118
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CardComponent, never>;
119
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CardComponent, "vl-card", never, { "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "hover": { "alias": "hover"; "required": false; "isSignal": true; }; "sectionTitle": { "alias": "sectionTitle"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
120
+ }
121
+
122
+ /**
123
+ * Pre-built confirmation dialog (wraps vl-dialog).
124
+ *
125
+ * Usage:
126
+ * <vl-confirm-dialog
127
+ * [isOpen]="showDelete()"
128
+ * title="Delete Expense"
129
+ * message="This action cannot be undone."
130
+ * confirmLabel="Delete"
131
+ * confirmVariant="danger"
132
+ * [loading]="isDeleting()"
133
+ * (confirmed)="onDelete()"
134
+ * (cancelled)="showDelete.set(false)" />
135
+ */
136
+ declare class ConfirmDialogComponent {
137
+ isOpen: _angular_core.InputSignal<boolean>;
138
+ title: _angular_core.InputSignal<string>;
139
+ subtitle: _angular_core.InputSignal<string | null>;
140
+ message: _angular_core.InputSignal<string>;
141
+ confirmLabel: _angular_core.InputSignal<string>;
142
+ cancelLabel: _angular_core.InputSignal<string>;
143
+ confirmVariant: _angular_core.InputSignal<"danger" | "primary">;
144
+ loading: _angular_core.InputSignal<boolean>;
145
+ confirmed: _angular_core.OutputEmitterRef<void>;
146
+ cancelled: _angular_core.OutputEmitterRef<void>;
147
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmDialogComponent, never>;
148
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmDialogComponent, "vl-confirm-dialog", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "message": { "alias": "message"; "required": false; "isSignal": true; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; "isSignal": true; }; "cancelLabel": { "alias": "cancelLabel"; "required": false; "isSignal": true; }; "confirmVariant": { "alias": "confirmVariant"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; }, { "confirmed": "confirmed"; "cancelled": "cancelled"; }, never, ["*"], true, never>;
149
+ }
150
+
151
+ type DialogSize = 'sm' | 'md' | 'lg';
152
+ interface DialogConfig {
153
+ title: string;
154
+ subtitle?: string;
155
+ size?: DialogSize;
156
+ hasFooter?: boolean;
157
+ }
158
+
159
+ declare class DialogComponent {
160
+ isOpen: _angular_core.InputSignal<boolean>;
161
+ title: _angular_core.InputSignal<string>;
162
+ subtitle: _angular_core.InputSignal<string | null>;
163
+ size: _angular_core.InputSignal<DialogSize>;
164
+ hasFooter: _angular_core.InputSignal<boolean>;
165
+ closed: _angular_core.OutputEmitterRef<void>;
166
+ private readonly renderer;
167
+ constructor();
168
+ onEscape(): void;
169
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DialogComponent, never>;
170
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DialogComponent, "vl-dialog", never, { "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "subtitle"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "hasFooter": { "alias": "hasFooter"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, never, ["*", "[dialog-footer]"], true, never>;
171
+ }
172
+
173
+ /**
174
+ * Dashed-border empty state card. Project an action button into the default slot.
175
+ *
176
+ * Usage:
177
+ * <vl-empty-state
178
+ * icon="M15 10.5a3 3 0 11-6 0..."
179
+ * title="No trips yet"
180
+ * description="Create your first trip to get started.">
181
+ * <button (click)="create()">Create Trip</button>
182
+ * </vl-empty-state>
183
+ */
184
+ declare class EmptyStateComponent {
185
+ /** SVG path `d` attribute for the icon. Or project via <svg empty-icon>. */
186
+ icon: _angular_core.InputSignal<string>;
187
+ title: _angular_core.InputSignal<string>;
188
+ description: _angular_core.InputSignal<string>;
189
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
190
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmptyStateComponent, "vl-empty-state", never, { "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "description": { "alias": "description"; "required": false; "isSignal": true; }; }, {}, never, ["[empty-icon]", "*"], true, never>;
191
+ }
192
+
193
+ /**
194
+ * Label + error wrapper for native inputs. Use content projection for the
195
+ * actual <input> so reactive forms work without ControlValueAccessor.
196
+ *
197
+ * Usage:
198
+ * <vl-input label="Trip Name" [error]="nameControl.errors && nameControl.touched ? 'Required' : null">
199
+ * <input type="text" formControlName="name" placeholder="Paris Weekend" />
200
+ * </vl-input>
201
+ */
202
+ declare class InputComponent {
203
+ label: _angular_core.InputSignal<string>;
204
+ error: _angular_core.InputSignal<string | null>;
205
+ hint: _angular_core.InputSignal<string>;
206
+ prefix: _angular_core.InputSignal<string>;
207
+ required: _angular_core.InputSignal<boolean>;
208
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputComponent, never>;
209
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputComponent, "vl-input", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "prefix": { "alias": "prefix"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
210
+ }
211
+
212
+ declare class LoaderComponent {
213
+ message: _angular_core.InputSignal<string>;
214
+ fullPage: _angular_core.InputSignal<boolean>;
215
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LoaderComponent, never>;
216
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LoaderComponent, "vl-loader", never, { "message": { "alias": "message"; "required": false; "isSignal": true; }; "fullPage": { "alias": "fullPage"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
217
+ }
218
+
219
+ type PasswordStrength = 'weak' | 'medium' | 'strong' | null;
220
+
221
+ /**
222
+ * Three-segment password strength indicator.
223
+ *
224
+ * Usage:
225
+ * <vl-password-strength [strength]="passwordStrength()" />
226
+ */
227
+ declare class PasswordStrengthComponent {
228
+ strength: _angular_core.InputSignal<PasswordStrength>;
229
+ showLabel: _angular_core.InputSignal<boolean>;
230
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PasswordStrengthComponent, never>;
231
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PasswordStrengthComponent, "vl-password-strength", never, { "strength": { "alias": "strength"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
232
+ }
233
+
234
+ type ProgressVariant = 'primary' | 'warning' | 'danger' | 'auto';
235
+
236
+ /**
237
+ * Horizontal progress bar with optional label and percentage text.
238
+ *
239
+ * Usage:
240
+ * <vl-progress-bar [value]="75" />
241
+ * <vl-progress-bar [value]="budgetUsed" variant="auto" [showLabel]="true" />
242
+ */
243
+ declare class ProgressBarComponent {
244
+ value: _angular_core.InputSignal<number>;
245
+ variant: _angular_core.InputSignal<ProgressVariant>;
246
+ showLabel: _angular_core.InputSignal<boolean>;
247
+ label: _angular_core.InputSignal<string>;
248
+ protected clampedValue: _angular_core.Signal<number>;
249
+ protected resolvedVariant: _angular_core.Signal<"warning" | "danger" | "primary">;
250
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressBarComponent, never>;
251
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressBarComponent, "vl-progress-bar", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "showLabel": { "alias": "showLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
252
+ }
253
+
254
+ /**
255
+ * Label + error wrapper for native <select> elements.
256
+ *
257
+ * Usage:
258
+ * <vl-select label="Currency" [error]="currencyControl.invalid && currencyControl.touched ? 'Required' : null">
259
+ * <select formControlName="currency">
260
+ * <option value="USD">USD</option>
261
+ * </select>
262
+ * </vl-select>
263
+ */
264
+ declare class SelectComponent {
265
+ label: _angular_core.InputSignal<string>;
266
+ error: _angular_core.InputSignal<string | null>;
267
+ hint: _angular_core.InputSignal<string>;
268
+ required: _angular_core.InputSignal<boolean>;
269
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectComponent, never>;
270
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectComponent, "vl-select", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "hint": { "alias": "hint"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
271
+ }
272
+
273
+ /**
274
+ * Shimmer placeholder for loading states.
275
+ *
276
+ * Usage:
277
+ * <vl-skeleton /> — single line, full width
278
+ * <vl-skeleton width="60%" height="1rem" />
279
+ * <vl-skeleton shape="circle" width="3rem" height="3rem" />
280
+ * <vl-skeleton [lines]="3" /> — stacked paragraph lines
281
+ */
282
+ declare class SkeletonComponent {
283
+ width: _angular_core.InputSignal<string>;
284
+ height: _angular_core.InputSignal<string>;
285
+ shape: _angular_core.InputSignal<"rect" | "circle">;
286
+ lines: _angular_core.InputSignal<number>;
287
+ protected lineArr(): number[];
288
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SkeletonComponent, never>;
289
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SkeletonComponent, "vl-skeleton", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "shape": { "alias": "shape"; "required": false; "isSignal": true; }; "lines": { "alias": "lines"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
290
+ }
291
+
292
+ /**
293
+ * Compact labeled metric card.
294
+ *
295
+ * Usage:
296
+ * <vl-stat-card label="Budget" value="$2,400" />
297
+ * <vl-stat-card label="Spent" value="$1,200" valueVariant="secondary" />
298
+ */
299
+ declare class StatCardComponent {
300
+ label: _angular_core.InputSignal<string>;
301
+ value: _angular_core.InputSignal<string>;
302
+ subtext: _angular_core.InputSignal<string>;
303
+ valueVariant: _angular_core.InputSignal<"primary" | "secondary" | "default" | "accent" | "destructive">;
304
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<StatCardComponent, never>;
305
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StatCardComponent, "vl-stat-card", never, { "label": { "alias": "label"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "subtext": { "alias": "subtext"; "required": false; "isSignal": true; }; "valueVariant": { "alias": "valueVariant"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
306
+ }
307
+
308
+ type TooltipPosition = 'top' | 'bottom' | 'left' | 'right';
309
+
310
+ /**
311
+ * Attribute directive that renders an accessible tooltip near the host element.
312
+ *
313
+ * Usage:
314
+ * <button vlTooltip="Save changes">Save</button>
315
+ * <span [vlTooltip]="label" vlTooltipPosition="bottom">...</span>
316
+ */
317
+ declare class TooltipDirective implements OnDestroy {
318
+ vlTooltip: _angular_core.InputSignal<string>;
319
+ vlTooltipPosition: _angular_core.InputSignal<TooltipPosition>;
320
+ vlTooltipDelay: _angular_core.InputSignal<number>;
321
+ protected readonly tooltipId: string;
322
+ private readonly el;
323
+ private readonly platformId;
324
+ private tooltipEl;
325
+ private showTimer;
326
+ show(): void;
327
+ hide(): void;
328
+ ngOnDestroy(): void;
329
+ private create;
330
+ private destroy;
331
+ private position;
332
+ private injectStyles;
333
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TooltipDirective, never>;
334
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TooltipDirective, "[vlTooltip]", never, { "vlTooltip": { "alias": "vlTooltip"; "required": false; "isSignal": true; }; "vlTooltipPosition": { "alias": "vlTooltipPosition"; "required": false; "isSignal": true; }; "vlTooltipDelay": { "alias": "vlTooltipDelay"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
335
+ }
336
+
337
+ /**
338
+ * Formats a number as a currency string using Intl.NumberFormat.
339
+ *
340
+ * Usage:
341
+ * {{ trip.budget | vlCurrency }} → "$2,400"
342
+ * {{ expense.amount | vlCurrency:'EUR' }} → "€1,200"
343
+ * {{ amount | vlCurrency:'INR':'symbol-narrow':'1.2-2' }}
344
+ */
345
+ declare class CurrencyFormatPipe implements PipeTransform {
346
+ transform(value: number | null | undefined, currencyCode?: string, display?: 'symbol' | 'symbol-narrow' | 'code' | 'name', locale?: string): string;
347
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CurrencyFormatPipe, never>;
348
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<CurrencyFormatPipe, "vlCurrency", true>;
349
+ }
350
+
351
+ type DatePreset = 'short' | 'medium' | 'long' | 'full' | 'time' | 'datetime' | 'relative';
352
+
353
+ /**
354
+ * Formats a Date, ISO string, or timestamp using Intl.DateTimeFormat.
355
+ *
356
+ * Presets:
357
+ * short → "Jun 28" (no year if current year)
358
+ * medium → "Jun 28, 2026"
359
+ * long → "June 28, 2026"
360
+ * full → "Sunday, June 28, 2026"
361
+ * time → "2:30 PM"
362
+ * datetime → "Jun 28, 2026, 2:30 PM"
363
+ * relative → "2 days ago" / "in 3 hours" (uses Intl.RelativeTimeFormat)
364
+ *
365
+ * Usage:
366
+ * {{ trip.startDate | vlDateFormat }}
367
+ * {{ trip.startDate | vlDateFormat:'long' }}
368
+ * {{ trip.startDate | vlDateFormat:'relative' }}
369
+ */
370
+ declare class DateFormatPipe implements PipeTransform {
371
+ transform(value: Date | string | number | null | undefined, preset?: DatePreset, locale?: string): string;
372
+ private options;
373
+ private toRelative;
374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DateFormatPipe, never>;
375
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<DateFormatPipe, "vlDateFormat", true>;
376
+ }
377
+
378
+ /**
379
+ * Returns a human-readable trip duration string.
380
+ *
381
+ * Usage:
382
+ * {{ trip.startDate | vlTripDuration:trip.endDate }} → "6 days"
383
+ */
384
+ declare class TripDurationPipe implements PipeTransform {
385
+ transform(startDate: Date | string | null | undefined, endDate?: Date | string | null): string;
386
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TripDurationPipe, never>;
387
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<TripDurationPipe, "vlTripDuration", true>;
388
+ }
389
+
390
+ interface Trip {
391
+ id: string;
392
+ name: string;
393
+ destination: string;
394
+ country: string;
395
+ startDate: Date;
396
+ endDate: Date;
397
+ budget: number;
398
+ spent: number;
399
+ status: 'planning' | 'ongoing' | 'completed';
400
+ currency: string;
401
+ }
402
+ interface TripDTO {
403
+ id: string;
404
+ name: string;
405
+ destination: string;
406
+ country: string;
407
+ startDate: string;
408
+ endDate: string;
409
+ budget: number;
410
+ spent: number;
411
+ status: 'planning' | 'ongoing' | 'completed';
412
+ currency: string;
413
+ }
414
+
415
+ type ExpenseCategory = 'food' | 'accommodation' | 'transport' | 'activities' | 'souvenirs' | 'other';
416
+ interface Expense {
417
+ id: string;
418
+ tripId: string;
419
+ category: ExpenseCategory;
420
+ amount: number;
421
+ description: string;
422
+ date: Date;
423
+ }
424
+ interface ExpenseDTO {
425
+ id: string;
426
+ tripId: string;
427
+ category: ExpenseCategory;
428
+ amount: number;
429
+ description: string;
430
+ date: string;
431
+ }
432
+ interface CategorySpending {
433
+ category: ExpenseCategory;
434
+ amount: number;
435
+ percentage: number;
436
+ icon: string;
437
+ }
438
+ interface DailyExpenses {
439
+ date: Date;
440
+ expenses: Expense[];
441
+ total: number;
442
+ }
443
+ declare const CATEGORY_ICONS: Record<ExpenseCategory, string>;
444
+ declare const CATEGORY_COLORS: Record<ExpenseCategory, string>;
445
+
446
+ interface ErrorInterface {
447
+ success: false;
448
+ message: string;
449
+ statusCode: number;
450
+ code: string;
451
+ details?: any;
452
+ }
453
+
454
+ interface ApiResponse<T = null> {
455
+ success: boolean;
456
+ data: T;
457
+ message?: string;
458
+ }
459
+
460
+ interface HttpOptions {
461
+ headers?: HttpHeaders | {
462
+ [header: string]: string | string[];
463
+ };
464
+ params?: HttpParams | {
465
+ [param: string]: string | string[];
466
+ };
467
+ responseType?: 'json' | 'text';
468
+ }
469
+ /**
470
+ * Shared HTTP service for micro-frontends.
471
+ *
472
+ * Services call with relative paths: `sdk.get('/trips')`.
473
+ * The host application's HTTP interceptor resolves the full API URL.
474
+ */
475
+ declare class SharedHttpService {
476
+ private http;
477
+ get<T>(path: string, options?: HttpOptions): Observable<T>;
478
+ post<T>(path: string, body: any, options?: HttpOptions): Observable<T>;
479
+ put<T>(path: string, body: any, options?: HttpOptions): Observable<T>;
480
+ delete<T>(path: string, options?: HttpOptions & {
481
+ body?: unknown;
482
+ }): Observable<T>;
483
+ patch<T>(path: string, body: any, options?: HttpOptions): Observable<T>;
484
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SharedHttpService, never>;
485
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SharedHttpService>;
486
+ }
487
+
488
+ declare class TripService {
489
+ private readonly httpService;
490
+ getAllTrips(): Observable<Trip[]>;
491
+ getTripById(id: string): Observable<Trip | undefined>;
492
+ private dtoToTrip;
493
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TripService, never>;
494
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<TripService>;
495
+ }
496
+
497
+ declare class ExpenseService {
498
+ private readonly httpService;
499
+ getExpensesByTripId(tripId: string): Observable<Expense[]>;
500
+ addExpense(expense: Omit<Expense, 'id'>): Observable<Expense>;
501
+ getExpensesByCategory(tripId: string): Observable<CategorySpending[]>;
502
+ getDailyExpenses(tripId: string): Observable<DailyExpenses[]>;
503
+ private calculateCategorySpending;
504
+ private groupExpensesByDay;
505
+ private dtoToExpense;
506
+ private expenseToDTO;
507
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ExpenseService, never>;
508
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ExpenseService>;
509
+ }
510
+
511
+ interface IEnvironment {
512
+ app: string;
513
+ apiUrl: string;
514
+ }
515
+ declare const EnvironmentToken: InjectionToken<IEnvironment>;
516
+
517
+ interface Currency {
518
+ code: string;
519
+ symbol: string;
520
+ name: string;
521
+ }
522
+ declare const CURRENCIES: Currency[];
523
+ declare function getCurrency(code: string): Currency | undefined;
524
+ declare function formatCurrency(amount: number, currencyCode?: string): string;
525
+
526
+ export { AvatarComponent, BadgeComponent, ButtonComponent, CATEGORY_COLORS, CATEGORY_ICONS, CURRENCIES, CardComponent, ConfirmDialogComponent, CurrencyFormatPipe, DateFormatPipe, DialogComponent, EmptyStateComponent, EnvironmentToken, ExpenseService, InputComponent, LoaderComponent, PasswordStrengthComponent, ProgressBarComponent, SelectComponent, SharedHttpService, SkeletonComponent, SnackbarComponent, SnackbarService, StatCardComponent, TooltipDirective, TripDurationPipe, TripService, formatCurrency, getCurrency };
527
+ export type { ApiResponse, BadgeVariant, ButtonSize, ButtonVariant, CategorySpending, Currency, DailyExpenses, DatePreset, DialogConfig, DialogSize, ErrorInterface, Expense, ExpenseCategory, ExpenseDTO, HttpOptions, PasswordStrength, ProgressVariant, SnackbarConfig, SnackbarItem, SnackbarType, TooltipPosition, Trip, TripDTO };