valtech-components 2.0.627 → 2.0.629

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,90 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import { ActionCardMetadata, ActionCardClickEvent } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * val-action-card
6
+ *
7
+ * A clickable card component with icon, title, description, and optional badge.
8
+ * Supports multiple icon formats: Ionicons, SVG paths, and image URLs.
9
+ *
10
+ * @example Basic usage with Ionicon
11
+ * ```html
12
+ * <val-action-card
13
+ * [props]="{
14
+ * icon: { ionicon: 'settings-outline' },
15
+ * title: 'Settings',
16
+ * description: 'Manage your preferences'
17
+ * }"
18
+ * (cardClick)="onCardClick($event)"
19
+ * />
20
+ * ```
21
+ *
22
+ * @example With routerLink navigation
23
+ * ```html
24
+ * <val-action-card
25
+ * [props]="{
26
+ * icon: { ionicon: 'person-outline', color: 'primary' },
27
+ * title: 'Profile',
28
+ * description: 'View and edit your profile',
29
+ * routerLink: '/settings/profile',
30
+ * showChevron: true
31
+ * }"
32
+ * />
33
+ * ```
34
+ *
35
+ * @example With custom SVG icon
36
+ * ```html
37
+ * <val-action-card
38
+ * [props]="{
39
+ * icon: { svgPath: 'M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5' },
40
+ * title: 'Custom Feature',
41
+ * description: 'A feature with custom SVG icon',
42
+ * badge: { text: 'NEW', color: 'light', backgroundColor: 'primary' }
43
+ * }"
44
+ * />
45
+ * ```
46
+ */
47
+ export declare class ActionCardComponent {
48
+ private i18n;
49
+ private navigation;
50
+ /** Component configuration */
51
+ readonly props: import("@angular/core").InputSignal<Partial<ActionCardMetadata>>;
52
+ /** Event emitted when card is clicked */
53
+ cardClick: EventEmitter<ActionCardClickEvent>;
54
+ /** Merged configuration with defaults */
55
+ config: import("@angular/core").Signal<{
56
+ token?: string;
57
+ icon?: import("./types").ActionCardIcon;
58
+ title?: string;
59
+ titleKey?: string;
60
+ description?: string;
61
+ descriptionKey?: string;
62
+ i18nNamespace?: string;
63
+ size: import("./types").ActionCardSize;
64
+ bordered: boolean;
65
+ borderColor?: string | (string & Record<never, never>);
66
+ backgroundColor?: string | (string & Record<never, never>);
67
+ shadowed: boolean;
68
+ disabled: boolean;
69
+ routerLink?: string | any[];
70
+ href?: string;
71
+ badge?: import("./types").ActionCardBadge;
72
+ showChevron: boolean;
73
+ }>;
74
+ /** Get title with i18n support */
75
+ getTitle(): string;
76
+ /** Get description with i18n support */
77
+ getDescription(): string;
78
+ /** Resolve color to CSS value */
79
+ private resolveColor;
80
+ getBackgroundColor(): string | null;
81
+ getBorderColor(): string | null;
82
+ getIconColor(): string | null;
83
+ getIconBackgroundColor(): string | null;
84
+ getBadgeColor(): string | null;
85
+ getBadgeBackgroundColor(): string | null;
86
+ /** Handle card click */
87
+ handleClick(event: MouseEvent): void;
88
+ static ɵfac: i0.ɵɵFactoryDeclaration<ActionCardComponent, never>;
89
+ static ɵcmp: i0.ɵɵComponentDeclaration<ActionCardComponent, "val-action-card", never, { "props": { "alias": "props"; "required": false; "isSignal": true; }; }, { "cardClick": "cardClick"; }, never, never, true, never>;
90
+ }
@@ -0,0 +1,83 @@
1
+ import { Color } from '@ionic/core';
2
+ /**
3
+ * Size options for action-card
4
+ */
5
+ export type ActionCardSize = 'small' | 'medium' | 'large';
6
+ /**
7
+ * Badge configuration for action-card
8
+ */
9
+ export interface ActionCardBadge {
10
+ /** Badge text */
11
+ text: string;
12
+ /** Badge color (Ionic color name or CSS color) */
13
+ color?: Color | string;
14
+ /** Badge background color */
15
+ backgroundColor?: Color | string;
16
+ }
17
+ /**
18
+ * Icon configuration - supports multiple icon sources
19
+ */
20
+ export interface ActionCardIcon {
21
+ /** Ionicon name (e.g., 'settings-outline', 'home') */
22
+ ionicon?: string;
23
+ /** SVG path data for custom icons */
24
+ svgPath?: string;
25
+ /** Image URL for custom images */
26
+ imageUrl?: string;
27
+ /** Icon color (Ionic color name or CSS color) */
28
+ color?: Color | string;
29
+ /** Icon background color */
30
+ backgroundColor?: Color | string;
31
+ }
32
+ /**
33
+ * Click event emitted by action-card
34
+ */
35
+ export interface ActionCardClickEvent {
36
+ /** Token identifier for the card */
37
+ token?: string;
38
+ /** Whether navigation was triggered (if routerLink was set) */
39
+ navigated?: boolean;
40
+ }
41
+ /**
42
+ * Metadata for val-action-card component
43
+ */
44
+ export interface ActionCardMetadata {
45
+ /** Unique token for identification */
46
+ token?: string;
47
+ /** Icon configuration object */
48
+ icon?: ActionCardIcon;
49
+ /** Card title (static text) */
50
+ title: string;
51
+ /** i18n key for title */
52
+ titleKey?: string;
53
+ /** Card description (static text) */
54
+ description?: string;
55
+ /** i18n key for description */
56
+ descriptionKey?: string;
57
+ /** i18n namespace for translations */
58
+ i18nNamespace?: string;
59
+ /** Card size variant */
60
+ size?: ActionCardSize;
61
+ /** Show border */
62
+ bordered?: boolean;
63
+ /** Border color */
64
+ borderColor?: Color | string;
65
+ /** Card background color */
66
+ backgroundColor?: Color | string;
67
+ /** Show shadow */
68
+ shadowed?: boolean;
69
+ /** Disabled state */
70
+ disabled?: boolean;
71
+ /** Router link for navigation */
72
+ routerLink?: string | any[];
73
+ /** External URL (opens in new tab/browser) */
74
+ href?: string;
75
+ /** Badge configuration */
76
+ badge?: ActionCardBadge;
77
+ /** Show chevron icon on the right */
78
+ showChevron?: boolean;
79
+ }
80
+ /**
81
+ * Default values for ActionCardMetadata
82
+ */
83
+ export declare const ACTION_CARD_DEFAULTS: Required<Pick<ActionCardMetadata, 'size' | 'bordered' | 'shadowed' | 'disabled' | 'showChevron'>>;
@@ -0,0 +1,30 @@
1
+ import { LinkedProvidersMetadata, ProviderDisplayInfo } from './types';
2
+ import { LinkedProvider, OAuthProvider } from '../../../services/auth/types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Linked Providers Component
6
+ *
7
+ * Muestra los proveedores OAuth vinculados al usuario y permite
8
+ * vincular nuevos o desvincular existentes.
9
+ *
10
+ * @example
11
+ * <val-linked-providers
12
+ * [props]="{
13
+ * providers: linkedProviders(),
14
+ * onLink: linkProvider,
15
+ * onUnlink: unlinkProvider
16
+ * }"
17
+ * />
18
+ */
19
+ export declare class LinkedProvidersComponent {
20
+ props: LinkedProvidersMetadata;
21
+ private alertCtrl;
22
+ linkedProviders: import("@angular/core").Signal<LinkedProvider[]>;
23
+ unlinkedProviders: import("@angular/core").Signal<ProviderDisplayInfo[]>;
24
+ canUnlink: import("@angular/core").Signal<boolean>;
25
+ getProviderInfo(provider: OAuthProvider): ProviderDisplayInfo;
26
+ onLinkProvider(provider: OAuthProvider): void;
27
+ confirmUnlink(provider: OAuthProvider): Promise<void>;
28
+ static ɵfac: i0.ɵɵFactoryDeclaration<LinkedProvidersComponent, never>;
29
+ static ɵcmp: i0.ɵɵComponentDeclaration<LinkedProvidersComponent, "val-linked-providers", never, { "props": { "alias": "props"; "required": false; }; }, {}, never, never, true, never>;
30
+ }
@@ -0,0 +1,38 @@
1
+ import { LinkedProvider, OAuthProvider } from '../../../services/auth/types';
2
+ /**
3
+ * Metadata para LinkedProvidersComponent.
4
+ */
5
+ export interface LinkedProvidersMetadata {
6
+ /** Lista de proveedores vinculados */
7
+ providers: LinkedProvider[];
8
+ /** Proveedores disponibles para vincular (default: ['google']) */
9
+ availableProviders?: OAuthProvider[];
10
+ /** Callback cuando se quiere vincular un provider */
11
+ onLink?: (provider: OAuthProvider) => void;
12
+ /** Callback cuando se quiere desvincular un provider */
13
+ onUnlink?: (provider: OAuthProvider) => void;
14
+ /** Mostrar botón para vincular nuevos (default: true) */
15
+ showLinkButton?: boolean;
16
+ /** Permitir desvincular (default: true si hay más de un método de auth) */
17
+ allowUnlink?: boolean;
18
+ /** Título de la sección */
19
+ title?: string;
20
+ /** Descripción de la sección */
21
+ description?: string;
22
+ /** Modo compacto sin card */
23
+ compact?: boolean;
24
+ }
25
+ /**
26
+ * Información visual de un proveedor OAuth.
27
+ */
28
+ export interface ProviderDisplayInfo {
29
+ id: OAuthProvider;
30
+ name: string;
31
+ icon: string;
32
+ color: string;
33
+ bgColor: string;
34
+ }
35
+ /**
36
+ * Información de proveedores OAuth disponibles.
37
+ */
38
+ export declare const OAUTH_PROVIDERS_INFO: Record<OAuthProvider, ProviderDisplayInfo>;
@@ -0,0 +1,34 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { Observable } from 'rxjs';
3
+ import { ComponentState } from '../../types';
4
+ /**
5
+ * Metadata for UsernameInputComponent.
6
+ */
7
+ export interface UsernameInputMetadata {
8
+ /** FormControl para el valor del username */
9
+ control: FormControl<string>;
10
+ /** Label del campo */
11
+ label?: string;
12
+ /** Placeholder del input */
13
+ placeholder?: string;
14
+ /** Prefijo visual (default: '@') */
15
+ prefix?: string;
16
+ /** Longitud mínima permitida (default: 3) */
17
+ minLength?: number;
18
+ /** Longitud máxima permitida (default: 30) */
19
+ maxLength?: number;
20
+ /** Función para verificar disponibilidad del username */
21
+ checkAvailability?: (handle: string) => Observable<boolean>;
22
+ /** Mensajes de error personalizados */
23
+ errors?: Record<string, string>;
24
+ /** Estado del componente */
25
+ state?: ComponentState;
26
+ /** Mostrar indicador de disponibilidad (default: true) */
27
+ showAvailability?: boolean;
28
+ /** Debounce en ms para check de disponibilidad (default: 500) */
29
+ debounceTime?: number;
30
+ }
31
+ /**
32
+ * Estado de disponibilidad del username.
33
+ */
34
+ export type UsernameAvailabilityStatus = 'idle' | 'checking' | 'available' | 'taken' | 'invalid';
@@ -0,0 +1,45 @@
1
+ import { OnInit, OnDestroy } from '@angular/core';
2
+ import { UsernameInputMetadata, UsernameAvailabilityStatus } from './types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Username Input Component
6
+ *
7
+ * Input especializado para usernames/handles con:
8
+ * - Prefijo '@' visual
9
+ * - Validación de formato (alfanuméricos y _)
10
+ * - Normalización automática (lowercase, sin espacios)
11
+ * - Verificación de disponibilidad con debounce
12
+ * - Estados visuales: available, taken, checking
13
+ *
14
+ * @example
15
+ * <val-username-input
16
+ * [props]="{
17
+ * control: usernameControl,
18
+ * label: 'Nombre de usuario',
19
+ * placeholder: 'tu_username',
20
+ * checkAvailability: checkFn
21
+ * }"
22
+ * />
23
+ */
24
+ export declare class UsernameInputComponent implements OnInit, OnDestroy {
25
+ props: UsernameInputMetadata;
26
+ private destroy$;
27
+ private checkAvailability$;
28
+ isFocused: import("@angular/core").WritableSignal<boolean>;
29
+ availabilityStatus: import("@angular/core").WritableSignal<UsernameAvailabilityStatus>;
30
+ hasError: import("@angular/core").Signal<boolean>;
31
+ showStatusMessage: import("@angular/core").Signal<boolean>;
32
+ statusColor: import("@angular/core").Signal<"success" | "danger">;
33
+ statusMessage: import("@angular/core").Signal<"" | "Username disponible" | "Username ya está en uso">;
34
+ errorMessage: import("@angular/core").Signal<string>;
35
+ ngOnInit(): void;
36
+ ngOnDestroy(): void;
37
+ onFocus(): void;
38
+ onBlur(): void;
39
+ onInput(event: CustomEvent): void;
40
+ private setupAvailabilityCheck;
41
+ private normalizeUsername;
42
+ private isValidFormat;
43
+ static ɵfac: i0.ɵɵFactoryDeclaration<UsernameInputComponent, never>;
44
+ static ɵcmp: i0.ɵɵComponentDeclaration<UsernameInputComponent, "val-username-input", never, { "props": { "alias": "props"; "required": false; }; }, {}, never, never, true, never>;
45
+ }
@@ -6,7 +6,7 @@ import { AuthStateService } from './auth-state.service';
6
6
  import { TokenService } from './token.service';
7
7
  import { AuthStorageService } from './storage.service';
8
8
  import { AuthSyncService } from './sync.service';
9
- import { SigninRequest, SigninResponse, SignupRequest, SignupResponse, VerifyEmailRequest, VerifyEmailResponse, ResendCodeRequest, ResendCodeResponse, MFAVerifyResponse, RefreshResponse, GetPermissionsResponse, GetProfileResponse, UpdateProfileRequest, UpdateProfileResponse, MFASetupResponse, MFAConfirmResponse, MFADisableResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, ChangePasswordResponse, DeleteAccountResponse, SwitchOrgResponse, MFAMethod, AuthError, ValtechAuthConfig, EnableNotificationsResult, NotificationPermissionState, RegisterDeviceResult, TOTPSetupResponse, TOTPVerifySetupResponse, TOTPDisableResponse, RegenerateBackupCodesResponse, BackupCodesCountResponse, OAuthProvider, LinkedProvider, HasPasswordResponse } from './types';
9
+ import { SigninRequest, SigninResponse, SignupRequest, SignupResponse, VerifyEmailRequest, VerifyEmailResponse, ResendCodeRequest, ResendCodeResponse, MFAVerifyResponse, RefreshResponse, GetPermissionsResponse, GetProfileResponse, UpdateProfileRequest, UpdateProfileResponse, MFASetupResponse, MFAConfirmResponse, MFADisableResponse, ForgotPasswordRequest, ForgotPasswordResponse, ResetPasswordRequest, ResetPasswordResponse, ChangePasswordResponse, DeleteAccountResponse, SwitchOrgResponse, MFAMethod, AuthError, ValtechAuthConfig, EnableNotificationsResult, NotificationPermissionState, RegisterDeviceResult, TOTPSetupResponse, TOTPVerifySetupResponse, TOTPDisableResponse, RegenerateBackupCodesResponse, BackupCodesCountResponse, OAuthProvider, LinkedProvider, HasPasswordResponse, UpdateHandleResponse, CheckHandleResponse } from './types';
10
10
  import { OAuthService } from './oauth.service';
11
11
  import { FirebaseService, MessagingService } from '../firebase';
12
12
  import { I18nService } from '../i18n';
@@ -298,6 +298,16 @@ export declare class AuthService implements OnDestroy {
298
298
  * Verifica si el usuario tiene un rol específico.
299
299
  */
300
300
  hasRole(role: string): boolean;
301
+ /**
302
+ * Actualiza el handle (@username) del usuario.
303
+ * @param handle - Nuevo handle (sin @, ej: "victorv")
304
+ */
305
+ updateHandle(handle: string): Observable<UpdateHandleResponse>;
306
+ /**
307
+ * Verifica si un handle está disponible.
308
+ * @param handle - Handle a verificar (sin @)
309
+ */
310
+ checkHandleAvailability(handle: string): Observable<CheckHandleResponse>;
301
311
  private get baseUrl();
302
312
  private handleSuccessfulAuth;
303
313
  private clearState;
@@ -64,6 +64,10 @@ export interface AuthUser {
64
64
  email: string;
65
65
  name?: string;
66
66
  phone?: string;
67
+ /** Username/handle del usuario (ej: @victorv) */
68
+ handle?: string;
69
+ /** URL del avatar del usuario */
70
+ avatarUrl?: string;
67
71
  roles: string[];
68
72
  permissions: string[];
69
73
  isSuperAdmin: boolean;
@@ -424,6 +428,10 @@ export interface GetProfileResponse {
424
428
  email: string;
425
429
  name: string;
426
430
  phone?: string;
431
+ /** Username/handle del usuario */
432
+ handle?: string;
433
+ /** URL del avatar del usuario */
434
+ avatarUrl?: string;
427
435
  emailVerified: boolean;
428
436
  phoneVerified: boolean;
429
437
  mfaEnabled: boolean;
@@ -766,3 +774,51 @@ export interface HasPasswordResponse {
766
774
  operationId: string;
767
775
  hasPassword: boolean;
768
776
  }
777
+ /**
778
+ * Request para actualizar handle (@username).
779
+ */
780
+ export interface UpdateHandleRequest {
781
+ handle: string;
782
+ }
783
+ /**
784
+ * Response de actualizar handle.
785
+ */
786
+ export interface UpdateHandleResponse {
787
+ operationId: string;
788
+ handle: string;
789
+ updated: boolean;
790
+ }
791
+ /**
792
+ * Request para verificar disponibilidad de handle.
793
+ */
794
+ export interface CheckHandleRequest {
795
+ handle: string;
796
+ }
797
+ /**
798
+ * Response de verificar disponibilidad de handle.
799
+ */
800
+ export interface CheckHandleResponse {
801
+ operationId: string;
802
+ handle: string;
803
+ available: boolean;
804
+ }
805
+ /**
806
+ * Response de obtener proveedores OAuth vinculados.
807
+ */
808
+ export interface GetLinkedProvidersResponse {
809
+ operationId: string;
810
+ providers: LinkedProvider[];
811
+ }
812
+ /**
813
+ * Request para desvincular un proveedor OAuth.
814
+ */
815
+ export interface UnlinkProviderRequest {
816
+ provider: OAuthProvider;
817
+ }
818
+ /**
819
+ * Response de desvincular proveedor.
820
+ */
821
+ export interface UnlinkProviderResponse {
822
+ operationId: string;
823
+ unlinked: boolean;
824
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "valtech-components",
3
- "version": "2.0.627",
3
+ "version": "2.0.629",
4
4
  "private": false,
5
5
  "bin": {
6
6
  "valtech-firebase-config": "./src/lib/services/firebase/scripts/generate-sw-config.js"
package/public-api.d.ts CHANGED
@@ -162,6 +162,12 @@ export * from './lib/components/molecules/links-accordion/types';
162
162
  export * from './lib/components/molecules/refresher/refresher.component';
163
163
  export * from './lib/components/molecules/refresher/types';
164
164
  export * from './lib/components/molecules/update-banner/update-banner.component';
165
+ export * from './lib/components/molecules/action-card/action-card.component';
166
+ export * from './lib/components/molecules/action-card/types';
167
+ export * from './lib/components/molecules/username-input/username-input.component';
168
+ export * from './lib/components/molecules/username-input/types';
169
+ export * from './lib/components/molecules/linked-providers/linked-providers.component';
170
+ export * from './lib/components/molecules/linked-providers/types';
165
171
  export * from './lib/components/organisms/article/article.component';
166
172
  export * from './lib/components/organisms/article/types';
167
173
  export * from './lib/components/organisms/banner/banner.component';