Files
2026-05-05 10:53:52 +02:00

482 lines
24 KiB
JavaScript

import {
DefaultValueAccessor,
FormBuilder,
FormControlName,
FormGroupDirective,
NgControlStatus,
NgControlStatusGroup,
ReactiveFormsModule,
Validators,
ɵNgNoValidate
} from "./chunk-VD6QIYHN.js";
import {
getErrorMessage
} from "./chunk-QDZ3GX5R.js";
import {
NzMessageService
} from "./chunk-GJYGTZ7J.js";
import {
AuthService,
NzIconDirective,
NzIconModule,
Router
} from "./chunk-2TRRHRR7.js";
import "./chunk-EDRPZB37.js";
import {
Component,
inject,
setClassMetadata,
signal,
ɵsetClassDebugInfo,
ɵɵProvidersFeature,
ɵɵadvance,
ɵɵconditional,
ɵɵconditionalCreate,
ɵɵdefineComponent,
ɵɵelement,
ɵɵelementEnd,
ɵɵelementStart,
ɵɵgetCurrentView,
ɵɵlistener,
ɵɵnextContext,
ɵɵproperty,
ɵɵresetView,
ɵɵrestoreView,
ɵɵtext
} from "./chunk-WI7WFVZR.js";
import "./chunk-WDMUDEB6.js";
// src/app/pages/auth/auth.ts
function AuthPage_Conditional_6_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " Bienvenue, connectez-vous ");
}
}
function AuthPage_Conditional_7_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " Cr\xE9ez votre compte ");
}
}
function AuthPage_Conditional_8_Conditional_5_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "span", 13);
\u0275\u0275text(1, "Email invalide");
\u0275\u0275elementEnd();
}
}
function AuthPage_Conditional_8_Conditional_10_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "span", 13);
\u0275\u0275text(1, "Mot de passe requis (min. 6 caract\xE8res)");
\u0275\u0275elementEnd();
}
}
function AuthPage_Conditional_8_Conditional_12_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " Connexion... ");
}
}
function AuthPage_Conditional_8_Conditional_13_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " Se Connecter \u2192 ");
}
}
function AuthPage_Conditional_8_Template(rf, ctx) {
if (rf & 1) {
const _r1 = \u0275\u0275getCurrentView();
\u0275\u0275elementStart(0, "form", 8);
\u0275\u0275listener("ngSubmit", function AuthPage_Conditional_8_Template_form_ngSubmit_0_listener() {
\u0275\u0275restoreView(_r1);
const ctx_r1 = \u0275\u0275nextContext();
return \u0275\u0275resetView(ctx_r1.login());
});
\u0275\u0275elementStart(1, "div", 9)(2, "div", 10);
\u0275\u0275element(3, "span", 11)(4, "input", 12);
\u0275\u0275elementEnd();
\u0275\u0275conditionalCreate(5, AuthPage_Conditional_8_Conditional_5_Template, 2, 0, "span", 13);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(6, "div", 9)(7, "div", 10);
\u0275\u0275element(8, "span", 14)(9, "input", 15);
\u0275\u0275elementEnd();
\u0275\u0275conditionalCreate(10, AuthPage_Conditional_8_Conditional_10_Template, 2, 0, "span", 13);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(11, "button", 16);
\u0275\u0275conditionalCreate(12, AuthPage_Conditional_8_Conditional_12_Template, 1, 0)(13, AuthPage_Conditional_8_Conditional_13_Template, 1, 0);
\u0275\u0275elementEnd()();
\u0275\u0275elementStart(14, "div", 17);
\u0275\u0275text(15, " Pas encore de compte ? ");
\u0275\u0275elementStart(16, "button", 18);
\u0275\u0275listener("click", function AuthPage_Conditional_8_Template_button_click_16_listener() {
\u0275\u0275restoreView(_r1);
const ctx_r1 = \u0275\u0275nextContext();
return \u0275\u0275resetView(ctx_r1.toggleMode());
});
\u0275\u0275text(17, "S'inscrire");
\u0275\u0275elementEnd()();
}
if (rf & 2) {
const ctx_r1 = \u0275\u0275nextContext();
\u0275\u0275property("formGroup", ctx_r1.loginForm);
\u0275\u0275advance(5);
\u0275\u0275conditional(ctx_r1.loginForm.controls.email.invalid && ctx_r1.loginForm.controls.email.touched ? 5 : -1);
\u0275\u0275advance(5);
\u0275\u0275conditional(ctx_r1.loginForm.controls.password.invalid && ctx_r1.loginForm.controls.password.touched ? 10 : -1);
\u0275\u0275advance();
\u0275\u0275property("disabled", ctx_r1.loading());
\u0275\u0275advance();
\u0275\u0275conditional(ctx_r1.loading() ? 12 : 13);
}
}
function AuthPage_Conditional_9_Conditional_5_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "span", 13);
\u0275\u0275text(1, "Nom requis (min. 2 caract\xE8res)");
\u0275\u0275elementEnd();
}
}
function AuthPage_Conditional_9_Conditional_10_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "span", 13);
\u0275\u0275text(1, "Email invalide");
\u0275\u0275elementEnd();
}
}
function AuthPage_Conditional_9_Conditional_15_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "span", 13);
\u0275\u0275text(1, "Mot de passe requis (min. 6 caract\xE8res)");
\u0275\u0275elementEnd();
}
}
function AuthPage_Conditional_9_Conditional_17_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " Cr\xE9ation... ");
}
}
function AuthPage_Conditional_9_Conditional_18_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275text(0, " S'inscrire \u2192 ");
}
}
function AuthPage_Conditional_9_Template(rf, ctx) {
if (rf & 1) {
const _r3 = \u0275\u0275getCurrentView();
\u0275\u0275elementStart(0, "form", 8);
\u0275\u0275listener("ngSubmit", function AuthPage_Conditional_9_Template_form_ngSubmit_0_listener() {
\u0275\u0275restoreView(_r3);
const ctx_r1 = \u0275\u0275nextContext();
return \u0275\u0275resetView(ctx_r1.register());
});
\u0275\u0275elementStart(1, "div", 9)(2, "div", 10);
\u0275\u0275element(3, "span", 19)(4, "input", 20);
\u0275\u0275elementEnd();
\u0275\u0275conditionalCreate(5, AuthPage_Conditional_9_Conditional_5_Template, 2, 0, "span", 13);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(6, "div", 9)(7, "div", 10);
\u0275\u0275element(8, "span", 11)(9, "input", 12);
\u0275\u0275elementEnd();
\u0275\u0275conditionalCreate(10, AuthPage_Conditional_9_Conditional_10_Template, 2, 0, "span", 13);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(11, "div", 9)(12, "div", 10);
\u0275\u0275element(13, "span", 14)(14, "input", 21);
\u0275\u0275elementEnd();
\u0275\u0275conditionalCreate(15, AuthPage_Conditional_9_Conditional_15_Template, 2, 0, "span", 13);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(16, "button", 16);
\u0275\u0275conditionalCreate(17, AuthPage_Conditional_9_Conditional_17_Template, 1, 0)(18, AuthPage_Conditional_9_Conditional_18_Template, 1, 0);
\u0275\u0275elementEnd()();
\u0275\u0275elementStart(19, "div", 17);
\u0275\u0275text(20, " D\xE9j\xE0 un compte ? ");
\u0275\u0275elementStart(21, "button", 18);
\u0275\u0275listener("click", function AuthPage_Conditional_9_Template_button_click_21_listener() {
\u0275\u0275restoreView(_r3);
const ctx_r1 = \u0275\u0275nextContext();
return \u0275\u0275resetView(ctx_r1.toggleMode());
});
\u0275\u0275text(22, "Se connecter");
\u0275\u0275elementEnd()();
}
if (rf & 2) {
const ctx_r1 = \u0275\u0275nextContext();
\u0275\u0275property("formGroup", ctx_r1.registerForm);
\u0275\u0275advance(5);
\u0275\u0275conditional(ctx_r1.registerForm.controls.name.invalid && ctx_r1.registerForm.controls.name.touched ? 5 : -1);
\u0275\u0275advance(5);
\u0275\u0275conditional(ctx_r1.registerForm.controls.email.invalid && ctx_r1.registerForm.controls.email.touched ? 10 : -1);
\u0275\u0275advance(5);
\u0275\u0275conditional(ctx_r1.registerForm.controls.password.invalid && ctx_r1.registerForm.controls.password.touched ? 15 : -1);
\u0275\u0275advance();
\u0275\u0275property("disabled", ctx_r1.loading());
\u0275\u0275advance();
\u0275\u0275conditional(ctx_r1.loading() ? 17 : 18);
}
}
function AuthPage_Conditional_11_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275element(0, "span", 6);
}
}
function AuthPage_Conditional_12_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275element(0, "span", 7);
}
}
var AuthPage = class _AuthPage {
fb = inject(FormBuilder);
router = inject(Router);
authService = inject(AuthService);
message = inject(NzMessageService);
mode = signal("login", ...ngDevMode ? [{ debugName: "mode" }] : []);
loading = signal(false, ...ngDevMode ? [{ debugName: "loading" }] : []);
isDark = signal(true, ...ngDevMode ? [{ debugName: "isDark" }] : []);
loginForm = this.fb.group({
email: ["", [Validators.required, Validators.email]],
password: ["", [Validators.required, Validators.minLength(6)]]
});
registerForm = this.fb.group({
name: ["", [Validators.required, Validators.minLength(2)]],
email: ["", [Validators.required, Validators.email]],
password: ["", [Validators.required, Validators.minLength(6)]]
});
toggleMode() {
this.mode.set(this.mode() === "login" ? "register" : "login");
}
toggleTheme() {
const html = document.documentElement;
if (html.classList.contains("dark")) {
html.classList.remove("dark");
this.isDark.set(false);
} else {
html.classList.add("dark");
this.isDark.set(true);
}
}
login() {
if (this.loginForm.invalid) {
Object.values(this.loginForm.controls).forEach((c) => c.markAsTouched());
return;
}
const { email, password } = this.loginForm.value;
this.loading.set(true);
this.authService.login(email, password).subscribe({
next: () => {
this.loading.set(false);
this.router.navigate(["/catalog"]);
},
error: (err) => {
this.loading.set(false);
this.message.error(getErrorMessage(err, "Email ou mot de passe incorrect"));
}
});
}
register() {
if (this.registerForm.invalid) {
Object.values(this.registerForm.controls).forEach((c) => c.markAsTouched());
return;
}
const { name, email, password } = this.registerForm.value;
this.loading.set(true);
this.authService.register(name, email, password).subscribe({
next: () => {
this.loading.set(false);
this.message.success("Compte cr\xE9\xE9 avec succ\xE8s !");
this.mode.set("login");
this.loginForm.patchValue({ email, password: "" });
},
error: (err) => {
this.loading.set(false);
this.message.error(getErrorMessage(err, "Erreur lors de la cr\xE9ation du compte"));
}
});
}
static \u0275fac = function AuthPage_Factory(__ngFactoryType__) {
return new (__ngFactoryType__ || _AuthPage)();
};
static \u0275cmp = /* @__PURE__ */ \u0275\u0275defineComponent({ type: _AuthPage, selectors: [["app-auth"]], features: [\u0275\u0275ProvidersFeature([NzMessageService])], decls: 13, vars: 4, consts: [[1, "auth-page"], [1, "auth-container"], [1, "auth-logo"], [1, "logo-title"], [1, "logo-subtitle"], ["aria-label", "Toggle theme", 1, "theme-toggle", 3, "click"], ["nz-icon", "", "nzType", "bulb", "nzTheme", "fill"], ["nz-icon", "", "nzType", "bulb", "nzTheme", "outline"], [1, "auth-form", 3, "ngSubmit", "formGroup"], [1, "input-group"], [1, "input-wrapper"], ["nz-icon", "", "nzType", "mail", "nzTheme", "outline", 1, "input-icon"], ["type", "email", "formControlName", "email", "placeholder", "Adresse email", "autocomplete", "email", 1, "auth-input"], [1, "field-error"], ["nz-icon", "", "nzType", "lock", "nzTheme", "outline", 1, "input-icon"], ["type", "password", "formControlName", "password", "placeholder", "Mot de passe", "autocomplete", "current-password", 1, "auth-input"], ["type", "submit", 1, "auth-btn", 3, "disabled"], [1, "auth-switch"], ["type", "button", 1, "switch-btn", 3, "click"], ["nz-icon", "", "nzType", "user", "nzTheme", "outline", 1, "input-icon"], ["type", "text", "formControlName", "name", "placeholder", "Nom complet", "autocomplete", "name", 1, "auth-input"], ["type", "password", "formControlName", "password", "placeholder", "Mot de passe", "autocomplete", "new-password", 1, "auth-input"]], template: function AuthPage_Template(rf, ctx) {
if (rf & 1) {
\u0275\u0275elementStart(0, "div", 0)(1, "div", 1)(2, "div", 2)(3, "h1", 3);
\u0275\u0275text(4, "MetaCourse");
\u0275\u0275elementEnd();
\u0275\u0275elementStart(5, "p", 4);
\u0275\u0275conditionalCreate(6, AuthPage_Conditional_6_Template, 1, 0)(7, AuthPage_Conditional_7_Template, 1, 0);
\u0275\u0275elementEnd()();
\u0275\u0275conditionalCreate(8, AuthPage_Conditional_8_Template, 18, 5);
\u0275\u0275conditionalCreate(9, AuthPage_Conditional_9_Template, 23, 6);
\u0275\u0275elementEnd();
\u0275\u0275elementStart(10, "button", 5);
\u0275\u0275listener("click", function AuthPage_Template_button_click_10_listener() {
return ctx.toggleTheme();
});
\u0275\u0275conditionalCreate(11, AuthPage_Conditional_11_Template, 1, 0, "span", 6)(12, AuthPage_Conditional_12_Template, 1, 0, "span", 7);
\u0275\u0275elementEnd()();
}
if (rf & 2) {
\u0275\u0275advance(6);
\u0275\u0275conditional(ctx.mode() === "login" ? 6 : 7);
\u0275\u0275advance(2);
\u0275\u0275conditional(ctx.mode() === "login" ? 8 : -1);
\u0275\u0275advance();
\u0275\u0275conditional(ctx.mode() === "register" ? 9 : -1);
\u0275\u0275advance(2);
\u0275\u0275conditional(ctx.isDark() ? 11 : 12);
}
}, dependencies: [ReactiveFormsModule, \u0275NgNoValidate, DefaultValueAccessor, NgControlStatus, NgControlStatusGroup, FormGroupDirective, FormControlName, NzIconModule, NzIconDirective], styles: ["\n\n.auth-page[_ngcontent-%COMP%] {\n background-color: var(--bg);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n position: relative;\n}\n.auth-container[_ngcontent-%COMP%] {\n width: 100%;\n max-width: 360px;\n}\n.auth-logo[_ngcontent-%COMP%] {\n text-align: center;\n margin-bottom: 40px;\n}\n.logo-icon[_ngcontent-%COMP%] {\n width: 64px;\n height: 64px;\n background-color: var(--primary);\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px;\n font-size: 28px;\n color: var(--primary-fg);\n}\n.logo-title[_ngcontent-%COMP%] {\n font-size: 28px;\n font-weight: 800;\n color: var(--text);\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n}\n.logo-subtitle[_ngcontent-%COMP%] {\n font-size: 14px;\n color: var(--text-muted);\n margin: 0;\n}\n.auth-form[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 20px;\n}\n.input-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.input-wrapper[_ngcontent-%COMP%] {\n position: relative;\n display: flex;\n align-items: center;\n}\n.input-icon[_ngcontent-%COMP%] {\n position: absolute;\n left: 14px;\n color: var(--text-muted);\n font-size: 16px;\n z-index: 1;\n}\n.auth-input[_ngcontent-%COMP%] {\n width: 100%;\n background-color: var(--card);\n border: 1.5px solid var(--border);\n border-radius: 12px;\n padding: 14px 14px 14px 42px;\n color: var(--text);\n font-size: 15px;\n outline: none;\n transition: border-color 0.2s;\n}\n.auth-input[_ngcontent-%COMP%]:focus {\n border-color: #1abc9c;\n}\n.auth-input[_ngcontent-%COMP%]::placeholder {\n color: var(--text-muted);\n}\n.field-error[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #ff4d4f;\n padding-left: 4px;\n}\n.auth-btn[_ngcontent-%COMP%] {\n width: 100%;\n background-color: var(--primary);\n color: var(--primary-fg);\n border: none;\n border-radius: 12px;\n padding: 16px;\n font-size: 16px;\n font-weight: 700;\n cursor: pointer;\n margin-top: 4px;\n transition: opacity 0.2s;\n}\n.auth-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n opacity: 0.85;\n}\n.auth-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.auth-switch[_ngcontent-%COMP%] {\n text-align: center;\n font-size: 14px;\n color: var(--text-muted);\n}\n.switch-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #1abc9c;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n padding: 0;\n margin-left: 4px;\n text-decoration: underline;\n}\n.theme-toggle[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 24px;\n right: 24px;\n width: 44px;\n height: 44px;\n background-color: var(--card);\n border: 1px solid var(--border);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n color: var(--text);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: transform 0.2s;\n}\n.theme-toggle[_ngcontent-%COMP%]:hover {\n transform: scale(1.1);\n}\n/*# sourceMappingURL=auth.css.map */"] });
};
(() => {
(typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(AuthPage, [{
type: Component,
args: [{ selector: "app-auth", imports: [ReactiveFormsModule, NzIconModule], providers: [NzMessageService], template: `<div class="auth-page">
<div class="auth-container">
<div class="auth-logo">
<h1 class="logo-title">MetaCourse</h1>
<p class="logo-subtitle">
@if (mode() === 'login') {
Bienvenue, connectez-vous
} @else {
Cr\xE9ez votre compte
}
</p>
</div>
<!-- Login Form -->
@if (mode() === 'login') {
<form [formGroup]="loginForm" (ngSubmit)="login()" class="auth-form">
<div class="input-group">
<div class="input-wrapper">
<span nz-icon nzType="mail" nzTheme="outline" class="input-icon"></span>
<input
type="email"
formControlName="email"
placeholder="Adresse email"
class="auth-input"
autocomplete="email"
/>
</div>
@if (loginForm.controls.email.invalid && loginForm.controls.email.touched) {
<span class="field-error">Email invalide</span>
}
</div>
<div class="input-group">
<div class="input-wrapper">
<span nz-icon nzType="lock" nzTheme="outline" class="input-icon"></span>
<input
type="password"
formControlName="password"
placeholder="Mot de passe"
class="auth-input"
autocomplete="current-password"
/>
</div>
@if (loginForm.controls.password.invalid && loginForm.controls.password.touched) {
<span class="field-error">Mot de passe requis (min. 6 caract\xE8res)</span>
}
</div>
<button type="submit" class="auth-btn" [disabled]="loading()">
@if (loading()) {
Connexion...
} @else {
Se Connecter &rarr;
}
</button>
</form>
<div class="auth-switch">
Pas encore de compte ?
<button type="button" class="switch-btn" (click)="toggleMode()">S'inscrire</button>
</div>
}
<!-- Register Form -->
@if (mode() === 'register') {
<form [formGroup]="registerForm" (ngSubmit)="register()" class="auth-form">
<div class="input-group">
<div class="input-wrapper">
<span nz-icon nzType="user" nzTheme="outline" class="input-icon"></span>
<input
type="text"
formControlName="name"
placeholder="Nom complet"
class="auth-input"
autocomplete="name"
/>
</div>
@if (registerForm.controls.name.invalid && registerForm.controls.name.touched) {
<span class="field-error">Nom requis (min. 2 caract\xE8res)</span>
}
</div>
<div class="input-group">
<div class="input-wrapper">
<span nz-icon nzType="mail" nzTheme="outline" class="input-icon"></span>
<input
type="email"
formControlName="email"
placeholder="Adresse email"
class="auth-input"
autocomplete="email"
/>
</div>
@if (registerForm.controls.email.invalid && registerForm.controls.email.touched) {
<span class="field-error">Email invalide</span>
}
</div>
<div class="input-group">
<div class="input-wrapper">
<span nz-icon nzType="lock" nzTheme="outline" class="input-icon"></span>
<input
type="password"
formControlName="password"
placeholder="Mot de passe"
class="auth-input"
autocomplete="new-password"
/>
</div>
@if (registerForm.controls.password.invalid && registerForm.controls.password.touched) {
<span class="field-error">Mot de passe requis (min. 6 caract\xE8res)</span>
}
</div>
<button type="submit" class="auth-btn" [disabled]="loading()">
@if (loading()) {
Cr\xE9ation...
} @else {
S'inscrire &rarr;
}
</button>
</form>
<div class="auth-switch">
D\xE9j\xE0 un compte ?
<button type="button" class="switch-btn" (click)="toggleMode()">Se connecter</button>
</div>
}
</div>
<!-- Theme Toggle -->
<button class="theme-toggle" (click)="toggleTheme()" aria-label="Toggle theme">
@if (isDark()) {
<span nz-icon nzType="bulb" nzTheme="fill"></span>
} @else {
<span nz-icon nzType="bulb" nzTheme="outline"></span>
}
</button>
</div>
`, styles: ["/* src/app/pages/auth/auth.css */\n.auth-page {\n background-color: var(--bg);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n position: relative;\n}\n.auth-container {\n width: 100%;\n max-width: 360px;\n}\n.auth-logo {\n text-align: center;\n margin-bottom: 40px;\n}\n.logo-icon {\n width: 64px;\n height: 64px;\n background-color: var(--primary);\n border-radius: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 0 auto 16px;\n font-size: 28px;\n color: var(--primary-fg);\n}\n.logo-title {\n font-size: 28px;\n font-weight: 800;\n color: var(--text);\n margin: 0 0 8px;\n letter-spacing: -0.5px;\n}\n.logo-subtitle {\n font-size: 14px;\n color: var(--text-muted);\n margin: 0;\n}\n.auth-form {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-bottom: 20px;\n}\n.input-group {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.input-wrapper {\n position: relative;\n display: flex;\n align-items: center;\n}\n.input-icon {\n position: absolute;\n left: 14px;\n color: var(--text-muted);\n font-size: 16px;\n z-index: 1;\n}\n.auth-input {\n width: 100%;\n background-color: var(--card);\n border: 1.5px solid var(--border);\n border-radius: 12px;\n padding: 14px 14px 14px 42px;\n color: var(--text);\n font-size: 15px;\n outline: none;\n transition: border-color 0.2s;\n}\n.auth-input:focus {\n border-color: #1abc9c;\n}\n.auth-input::placeholder {\n color: var(--text-muted);\n}\n.field-error {\n font-size: 12px;\n color: #ff4d4f;\n padding-left: 4px;\n}\n.auth-btn {\n width: 100%;\n background-color: var(--primary);\n color: var(--primary-fg);\n border: none;\n border-radius: 12px;\n padding: 16px;\n font-size: 16px;\n font-weight: 700;\n cursor: pointer;\n margin-top: 4px;\n transition: opacity 0.2s;\n}\n.auth-btn:hover:not(:disabled) {\n opacity: 0.85;\n}\n.auth-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n.auth-switch {\n text-align: center;\n font-size: 14px;\n color: var(--text-muted);\n}\n.switch-btn {\n background: none;\n border: none;\n color: #1abc9c;\n font-size: 14px;\n font-weight: 600;\n cursor: pointer;\n padding: 0;\n margin-left: 4px;\n text-decoration: underline;\n}\n.theme-toggle {\n position: fixed;\n bottom: 24px;\n right: 24px;\n width: 44px;\n height: 44px;\n background-color: var(--card);\n border: 1px solid var(--border);\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n font-size: 18px;\n color: var(--text);\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n transition: transform 0.2s;\n}\n.theme-toggle:hover {\n transform: scale(1.1);\n}\n/*# sourceMappingURL=auth.css.map */\n"] }]
}], null, null);
})();
(() => {
(typeof ngDevMode === "undefined" || ngDevMode) && \u0275setClassDebugInfo(AuthPage, { className: "AuthPage", filePath: "src/app/pages/auth/auth.ts", lineNumber: 16 });
})();
// src/app/pages/auth/auth.routes.ts
var AUTH_ROUTES = [
{ path: "", component: AuthPage }
];
export {
AUTH_ROUTES
};
//# sourceMappingURL=chunk-IOBMADH6.js.map