@avora-labs/meta-forge 1.0.5 → 1.1.2

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.
Files changed (20) hide show
  1. package/README.md +0 -0
  2. package/fesm2022/{avora-labs-meta-forge-amf-auth-shell.component-BWSdjBUS.mjs → avora-labs-meta-forge-amf-auth-shell.component-C89gSPc9.mjs} +59 -59
  3. package/fesm2022/avora-labs-meta-forge-amf-auth-shell.component-C89gSPc9.mjs.map +1 -0
  4. package/fesm2022/{avora-labs-meta-forge-contact-support.page-BAUiKm3P.mjs → avora-labs-meta-forge-contact-support.page-C_kdmzhL.mjs} +148 -148
  5. package/fesm2022/avora-labs-meta-forge-contact-support.page-C_kdmzhL.mjs.map +1 -0
  6. package/fesm2022/{avora-labs-meta-forge-forgot-password.page-0XLiBrV1.mjs → avora-labs-meta-forge-forgot-password.page-PY9_K4M-.mjs} +240 -240
  7. package/fesm2022/avora-labs-meta-forge-forgot-password.page-PY9_K4M-.mjs.map +1 -0
  8. package/fesm2022/{avora-labs-meta-forge-login.page-etTr5NqJ.mjs → avora-labs-meta-forge-login.page-BW-RWCQM.mjs} +76 -76
  9. package/fesm2022/avora-labs-meta-forge-login.page-BW-RWCQM.mjs.map +1 -0
  10. package/fesm2022/avora-labs-meta-forge.mjs +2098 -2098
  11. package/fesm2022/avora-labs-meta-forge.mjs.map +1 -1
  12. package/package.json +13 -6
  13. package/styles/_palettes.scss +84 -84
  14. package/styles/_themes.scss +96 -96
  15. package/styles/_variables.scss +56 -56
  16. package/styles/styles.scss +295 -295
  17. package/fesm2022/avora-labs-meta-forge-amf-auth-shell.component-BWSdjBUS.mjs.map +0 -1
  18. package/fesm2022/avora-labs-meta-forge-contact-support.page-BAUiKm3P.mjs.map +0 -1
  19. package/fesm2022/avora-labs-meta-forge-forgot-password.page-0XLiBrV1.mjs.map +0 -1
  20. package/fesm2022/avora-labs-meta-forge-login.page-etTr5NqJ.mjs.map +0 -1
@@ -5,7 +5,7 @@ import { FormsModule } from '@angular/forms';
5
5
  import * as i1 from '@angular/router';
6
6
  import { RouterModule } from '@angular/router';
7
7
  import { AuthService, ActionDispatcherService, APP_META_CONFIG_TOKEN, FormRendererComponent } from './avora-labs-meta-forge.mjs';
8
- import { A as AmfAuthShellComponent } from './avora-labs-meta-forge-amf-auth-shell.component-BWSdjBUS.mjs';
8
+ import { A as AmfAuthShellComponent } from './avora-labs-meta-forge-amf-auth-shell.component-C89gSPc9.mjs';
9
9
 
10
10
  class LoginComponent {
11
11
  router;
@@ -97,85 +97,85 @@ class LoginComponent {
97
97
  });
98
98
  }, 1200);
99
99
  }
100
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: LoginComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: LoginComponent, isStandalone: true, selector: "amf-login", ngImport: i0, template: `
102
- <amf-auth-shell
103
- [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
104
- [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'Sign in to your account'">
105
-
106
- <div class="login-form-container">
107
- <!-- AMF Data-Driven Form Definition -->
108
- <amf-form-renderer
109
- #renderer
110
- [config]="loginForm"
111
- (formSubmit)="onFormSubmit($event)">
112
- </amf-form-renderer>
113
-
114
- <!-- Custom Inline Options Row -->
115
- <div class="form-options">
116
- <label class="remember-me">
117
- <input type="checkbox" name="remember" [(ngModel)]="rememberMe">
118
- <span class="custom-check"></span>
119
- <span>Remember me</span>
120
- </label>
121
- <a routerLink="/forgot-password" class="forgot-link">Forgot password?</a>
122
- </div>
123
-
124
- <button type="button" class="login-btn" (click)="triggerSubmit()" [disabled]="loading()">
125
- @if (!loading()) {
126
- <span>Sign In</span>
127
- } @else {
128
- <div class="loader"></div>
129
- }
130
- </button>
131
- </div>
132
-
133
- <div class="auth-footer-note">
134
- Don't have an account? <a routerLink="/contact-support">Contact Support</a>
135
- </div>
136
- </amf-auth-shell>
100
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: LoginComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: LoginComponent, isStandalone: true, selector: "amf-login", ngImport: i0, template: `
102
+ <amf-auth-shell
103
+ [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
104
+ [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'Sign in to your account'">
105
+
106
+ <div class="login-form-container">
107
+ <!-- AMF Data-Driven Form Definition -->
108
+ <amf-form-renderer
109
+ #renderer
110
+ [config]="loginForm"
111
+ (formSubmit)="onFormSubmit($event)">
112
+ </amf-form-renderer>
113
+
114
+ <!-- Custom Inline Options Row -->
115
+ <div class="form-options">
116
+ <label class="remember-me">
117
+ <input type="checkbox" name="remember" [(ngModel)]="rememberMe">
118
+ <span class="custom-check"></span>
119
+ <span>Remember me</span>
120
+ </label>
121
+ <a routerLink="/forgot-password" class="forgot-link">Forgot password?</a>
122
+ </div>
123
+
124
+ <button type="button" class="login-btn" (click)="triggerSubmit()" [disabled]="loading()">
125
+ @if (!loading()) {
126
+ <span>Sign In</span>
127
+ } @else {
128
+ <div class="loader"></div>
129
+ }
130
+ </button>
131
+ </div>
132
+
133
+ <div class="auth-footer-note">
134
+ Don't have an account? <a routerLink="/contact-support">Contact Support</a>
135
+ </div>
136
+ </amf-auth-shell>
137
137
  `, isInline: true, styles: [":host{display:block;height:100%}.login-form-container{display:flex;flex-direction:column;gap:24px}::ng-deep .login-form-container .amf-form{gap:24px}::ng-deep .login-form-container .amf-form-fields{gap:24px}::ng-deep .login-form-container .amf-field{display:flex;flex-direction:column;gap:8px}::ng-deep .login-form-container .field-label{font-size:.875rem!important;font-weight:600!important;color:#cbd5e1!important;margin-bottom:0!important}::ng-deep .login-form-container .field-input-wrapper{border-radius:12px!important;border:1px solid rgba(255,255,255,.08)!important;background:#ffffff0a!important;transition:all .3s!important;overflow:hidden;box-shadow:none!important}::ng-deep .login-form-container .field-input-wrapper:focus-within{border-color:var(--app-primary, #6366f1)!important;background:#ffffff0f!important;box-shadow:0 0 20px var(--app-glow, rgba(99,102,241,.3))!important}::ng-deep .login-form-container .field-input{padding:13px 16px!important;border:none!important;background:transparent!important;font-size:1rem!important;color:#f1f5f9!important}::ng-deep .login-form-container .field-input::placeholder{color:#64748b!important}::ng-deep .login-form-container .pwd-toggle-btn{color:#64748b!important}::ng-deep .login-form-container .pwd-toggle-btn:hover{color:var(--app-primary, #6366f1)!important}.form-options{display:flex;align-items:center;justify-content:space-between;font-size:.875rem}.remember-me{display:flex;align-items:center;gap:8px;cursor:pointer;color:#94a3b8}.remember-me input{display:none}.custom-check{width:16px;height:16px;border-radius:4px;border:1px solid rgba(255,255,255,.15);background:#ffffff0a;position:relative;transition:all .2s}.remember-me input:checked+.custom-check{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));border-color:transparent}.remember-me input:checked+.custom-check:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.forgot-link{color:var(--app-primary, #6366f1);font-weight:500;transition:all .2s;text-decoration:none}.forgot-link:hover{text-shadow:0 0 12px var(--app-glow, rgba(99,102,241,.3))}.login-btn{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));color:#fff;padding:14px;border:none;border-radius:12px;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.login-btn:hover{transform:translateY(-2px);box-shadow:0 10px 30px -5px var(--app-glow, rgba(99,102,241,.5))}.login-btn:disabled{opacity:.7;cursor:not-allowed;transform:none}.auth-footer-note{text-align:center;margin-top:32px;font-size:.875rem;color:#64748b}.auth-footer-note a{color:var(--app-primary, #6366f1);font-weight:600;text-decoration:none}.loader{width:20px;height:20px;border:3px solid rgba(255,255,255,.2);border-top:3px solid white;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: AmfAuthShellComponent, selector: "amf-auth-shell", inputs: ["brandName", "brandTagline", "maxWidth"] }, { kind: "component", type: FormRendererComponent, selector: "amf-form-renderer", inputs: ["config", "context"], outputs: ["formSubmit", "formCancel", "formChange"] }] });
138
138
  }
139
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: LoginComponent, decorators: [{
139
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: LoginComponent, decorators: [{
140
140
  type: Component,
141
- args: [{ selector: 'amf-login', standalone: true, imports: [FormsModule, RouterModule, AmfAuthShellComponent, FormRendererComponent], template: `
142
- <amf-auth-shell
143
- [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
144
- [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'Sign in to your account'">
145
-
146
- <div class="login-form-container">
147
- <!-- AMF Data-Driven Form Definition -->
148
- <amf-form-renderer
149
- #renderer
150
- [config]="loginForm"
151
- (formSubmit)="onFormSubmit($event)">
152
- </amf-form-renderer>
153
-
154
- <!-- Custom Inline Options Row -->
155
- <div class="form-options">
156
- <label class="remember-me">
157
- <input type="checkbox" name="remember" [(ngModel)]="rememberMe">
158
- <span class="custom-check"></span>
159
- <span>Remember me</span>
160
- </label>
161
- <a routerLink="/forgot-password" class="forgot-link">Forgot password?</a>
162
- </div>
163
-
164
- <button type="button" class="login-btn" (click)="triggerSubmit()" [disabled]="loading()">
165
- @if (!loading()) {
166
- <span>Sign In</span>
167
- } @else {
168
- <div class="loader"></div>
169
- }
170
- </button>
171
- </div>
172
-
173
- <div class="auth-footer-note">
174
- Don't have an account? <a routerLink="/contact-support">Contact Support</a>
175
- </div>
176
- </amf-auth-shell>
141
+ args: [{ selector: 'amf-login', standalone: true, imports: [FormsModule, RouterModule, AmfAuthShellComponent, FormRendererComponent], template: `
142
+ <amf-auth-shell
143
+ [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
144
+ [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'Sign in to your account'">
145
+
146
+ <div class="login-form-container">
147
+ <!-- AMF Data-Driven Form Definition -->
148
+ <amf-form-renderer
149
+ #renderer
150
+ [config]="loginForm"
151
+ (formSubmit)="onFormSubmit($event)">
152
+ </amf-form-renderer>
153
+
154
+ <!-- Custom Inline Options Row -->
155
+ <div class="form-options">
156
+ <label class="remember-me">
157
+ <input type="checkbox" name="remember" [(ngModel)]="rememberMe">
158
+ <span class="custom-check"></span>
159
+ <span>Remember me</span>
160
+ </label>
161
+ <a routerLink="/forgot-password" class="forgot-link">Forgot password?</a>
162
+ </div>
163
+
164
+ <button type="button" class="login-btn" (click)="triggerSubmit()" [disabled]="loading()">
165
+ @if (!loading()) {
166
+ <span>Sign In</span>
167
+ } @else {
168
+ <div class="loader"></div>
169
+ }
170
+ </button>
171
+ </div>
172
+
173
+ <div class="auth-footer-note">
174
+ Don't have an account? <a routerLink="/contact-support">Contact Support</a>
175
+ </div>
176
+ </amf-auth-shell>
177
177
  `, styles: [":host{display:block;height:100%}.login-form-container{display:flex;flex-direction:column;gap:24px}::ng-deep .login-form-container .amf-form{gap:24px}::ng-deep .login-form-container .amf-form-fields{gap:24px}::ng-deep .login-form-container .amf-field{display:flex;flex-direction:column;gap:8px}::ng-deep .login-form-container .field-label{font-size:.875rem!important;font-weight:600!important;color:#cbd5e1!important;margin-bottom:0!important}::ng-deep .login-form-container .field-input-wrapper{border-radius:12px!important;border:1px solid rgba(255,255,255,.08)!important;background:#ffffff0a!important;transition:all .3s!important;overflow:hidden;box-shadow:none!important}::ng-deep .login-form-container .field-input-wrapper:focus-within{border-color:var(--app-primary, #6366f1)!important;background:#ffffff0f!important;box-shadow:0 0 20px var(--app-glow, rgba(99,102,241,.3))!important}::ng-deep .login-form-container .field-input{padding:13px 16px!important;border:none!important;background:transparent!important;font-size:1rem!important;color:#f1f5f9!important}::ng-deep .login-form-container .field-input::placeholder{color:#64748b!important}::ng-deep .login-form-container .pwd-toggle-btn{color:#64748b!important}::ng-deep .login-form-container .pwd-toggle-btn:hover{color:var(--app-primary, #6366f1)!important}.form-options{display:flex;align-items:center;justify-content:space-between;font-size:.875rem}.remember-me{display:flex;align-items:center;gap:8px;cursor:pointer;color:#94a3b8}.remember-me input{display:none}.custom-check{width:16px;height:16px;border-radius:4px;border:1px solid rgba(255,255,255,.15);background:#ffffff0a;position:relative;transition:all .2s}.remember-me input:checked+.custom-check{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));border-color:transparent}.remember-me input:checked+.custom-check:after{content:\"\";position:absolute;left:5px;top:2px;width:4px;height:7px;border:solid white;border-width:0 2px 2px 0;transform:rotate(45deg)}.forgot-link{color:var(--app-primary, #6366f1);font-weight:500;transition:all .2s;text-decoration:none}.forgot-link:hover{text-shadow:0 0 12px var(--app-glow, rgba(99,102,241,.3))}.login-btn{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));color:#fff;padding:14px;border:none;border-radius:12px;font-size:1rem;font-weight:600;cursor:pointer;transition:all .3s;display:flex;align-items:center;justify-content:center;position:relative;overflow:hidden}.login-btn:hover{transform:translateY(-2px);box-shadow:0 10px 30px -5px var(--app-glow, rgba(99,102,241,.5))}.login-btn:disabled{opacity:.7;cursor:not-allowed;transform:none}.auth-footer-note{text-align:center;margin-top:32px;font-size:.875rem;color:#64748b}.auth-footer-note a{color:var(--app-primary, #6366f1);font-weight:600;text-decoration:none}.loader{width:20px;height:20px;border:3px solid rgba(255,255,255,.2);border-top:3px solid white;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}\n"] }]
178
178
  }], ctorParameters: () => [{ type: i1.Router }] });
179
179
 
180
180
  export { LoginComponent };
181
- //# sourceMappingURL=avora-labs-meta-forge-login.page-etTr5NqJ.mjs.map
181
+ //# sourceMappingURL=avora-labs-meta-forge-login.page-BW-RWCQM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avora-labs-meta-forge-login.page-BW-RWCQM.mjs","sources":["../../../projects/avora-meta-forge/src/lib/avora-meta-forge/pages/auth/login.page.ts"],"sourcesContent":["import { Component, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { Router, RouterModule } from '@angular/router';\nimport { AuthService } from '../../../core/auth/auth.service';\nimport { ActionDispatcherService } from '../../core/action-dispatcher.service';\nimport { AmfAuthShellComponent } from '../../renderers/auth/amf-auth-shell.component';\nimport { FormRendererComponent } from '../../renderers/form/form-renderer.component';\nimport { FormMeta } from '../../models/meta.types';\nimport { APP_META_CONFIG_TOKEN } from '../../avora-meta-forge.provider';\n@Component({\n selector: 'amf-login',\n standalone: true,\n imports: [FormsModule, RouterModule, AmfAuthShellComponent, FormRendererComponent],\n template: `\n <amf-auth-shell \n [brandName]=\"meta.auth?.builtInUI?.brandName || meta.app.name\" \n [brandTagline]=\"meta.auth?.builtInUI?.brandTagline || 'Sign in to your account'\">\n \n <div class=\"login-form-container\">\n <!-- AMF Data-Driven Form Definition -->\n <amf-form-renderer \n #renderer\n [config]=\"loginForm\" \n (formSubmit)=\"onFormSubmit($event)\">\n </amf-form-renderer>\n\n <!-- Custom Inline Options Row -->\n <div class=\"form-options\">\n <label class=\"remember-me\">\n <input type=\"checkbox\" name=\"remember\" [(ngModel)]=\"rememberMe\">\n <span class=\"custom-check\"></span>\n <span>Remember me</span>\n </label>\n <a routerLink=\"/forgot-password\" class=\"forgot-link\">Forgot password?</a>\n </div>\n\n <button type=\"button\" class=\"login-btn\" (click)=\"triggerSubmit()\" [disabled]=\"loading()\">\n @if (!loading()) {\n <span>Sign In</span>\n } @else {\n <div class=\"loader\"></div>\n }\n </button>\n </div>\n\n <div class=\"auth-footer-note\">\n Don't have an account? <a routerLink=\"/contact-support\">Contact Support</a>\n </div>\n </amf-auth-shell>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n\n .login-form-container {\n display: flex;\n flex-direction: column;\n gap: 24px;\n }\n\n /* ── Map AMF Form classes to exactly match input-glass style ── */\n ::ng-deep .login-form-container .amf-form {\n gap: 24px;\n }\n ::ng-deep .login-form-container .amf-form-fields {\n gap: 24px;\n }\n ::ng-deep .login-form-container .amf-field {\n display: flex;\n flex-direction: column;\n gap: 8px;\n }\n ::ng-deep .login-form-container .field-label {\n font-size: 0.875rem !important;\n font-weight: 600 !important;\n color: #cbd5e1 !important;\n margin-bottom: 0 !important;\n }\n ::ng-deep .login-form-container .field-input-wrapper {\n border-radius: 12px !important;\n border: 1px solid rgba(255, 255, 255, 0.08) !important;\n background: rgba(255, 255, 255, 0.04) !important;\n transition: all 0.3s !important;\n overflow: hidden;\n box-shadow: none !important;\n }\n ::ng-deep .login-form-container .field-input-wrapper:focus-within {\n border-color: var(--app-primary, #6366f1) !important;\n background: rgba(255, 255, 255, 0.06) !important;\n box-shadow: 0 0 20px var(--app-glow, rgba(99,102,241,0.3)) !important;\n }\n ::ng-deep .login-form-container .field-input {\n padding: 13px 16px !important;\n border: none !important;\n background: transparent !important;\n font-size: 1rem !important;\n color: #f1f5f9 !important;\n }\n ::ng-deep .login-form-container .field-input::placeholder {\n color: #64748b !important;\n }\n /* Adjust password eye toggle specifically for this glass look */\n ::ng-deep .login-form-container .pwd-toggle-btn {\n color: #64748b !important;\n }\n ::ng-deep .login-form-container .pwd-toggle-btn:hover {\n color: var(--app-primary, #6366f1) !important;\n }\n\n .form-options {\n display: flex;\n align-items: center;\n justify-content: space-between;\n font-size: 0.875rem;\n }\n\n .remember-me {\n display: flex;\n align-items: center;\n gap: 8px;\n cursor: pointer;\n color: #94a3b8;\n }\n\n .remember-me input { display: none; }\n\n .custom-check {\n width: 16px;\n height: 16px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.15);\n background: rgba(255,255,255,0.04);\n position: relative;\n transition: all 0.2s;\n }\n\n .remember-me input:checked + .custom-check {\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n border-color: transparent;\n }\n\n .remember-me input:checked + .custom-check::after {\n content: '';\n position: absolute;\n left: 5px; top: 2px;\n width: 4px; height: 7px;\n border: solid white;\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n }\n\n .forgot-link {\n color: var(--app-primary, #6366f1);\n font-weight: 500;\n transition: all 0.2s;\n text-decoration: none;\n }\n\n .forgot-link:hover {\n text-shadow: 0 0 12px var(--app-glow, rgba(99,102,241,0.3));\n }\n\n .login-btn {\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n color: white;\n padding: 14px;\n border: none;\n border-radius: 12px;\n font-size: 1rem;\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s;\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n overflow: hidden;\n }\n\n .login-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 10px 30px -5px var(--app-glow, rgba(99,102,241,0.5));\n }\n\n .login-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n transform: none;\n }\n\n .auth-footer-note {\n text-align: center;\n margin-top: 32px;\n font-size: 0.875rem;\n color: #64748b;\n }\n\n .auth-footer-note a {\n color: var(--app-primary, #6366f1);\n font-weight: 600;\n text-decoration: none;\n }\n\n .loader {\n width: 20px;\n height: 20px;\n border: 3px solid rgba(255,255,255,0.2);\n border-top: 3px solid white;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n\n @keyframes spin {\n 0% { transform: rotate(0deg); }\n 100% { transform: rotate(360deg); }\n }\n `]\n})\nexport class LoginComponent {\n private auth = inject(AuthService);\n private dispatcher = inject(ActionDispatcherService);\n protected meta: any = inject(APP_META_CONFIG_TOKEN, { optional: true }) || { app: { name: 'AvoraMetaForge' } };\n\n loading = signal(false);\n rememberMe = false;\n\n // JSON Meta Definition replacing the hardcoded HTML fields\n loginForm: FormMeta = {\n id: 'loginForm',\n hideSubmit: true, // We provide our own exact-match custom button below\n fields: [\n {\n key: 'email',\n type: 'email',\n label: 'Email Address',\n placeholder: 'name@company.com',\n validators: [{ type: 'required' }]\n },\n {\n key: 'password',\n type: 'password',\n label: 'Password',\n placeholder: '••••••••',\n validators: [{ type: 'required' }]\n }\n ]\n };\n\n constructor(private router: Router) { }\n\n triggerSubmit(): void {\n // Dispatches standard AMF action to submit the specific form\n this.dispatcher.dispatch({\n type: 'submit-form',\n config: { formId: 'loginForm' }\n });\n }\n\n onFormSubmit(values: any): void {\n if (!values.email || !values.password) return;\n\n this.loading.set(true);\n\n setTimeout(() => {\n this.loading.set(false);\n \n this.dispatcher.dispatch({\n type: 'open-modal',\n config: {\n title: 'Two-Step Verification',\n size: 'sm',\n content: {\n type: 'form',\n config: {\n fields: [\n {\n name: 'otp',\n label: 'Enter 6-digit PIN',\n type: 'otp',\n required: true,\n otpLength: 6,\n validation: { minLength: 6, maxLength: 6 }\n }\n ],\n submitLabel: 'Verify & Login',\n loadingLabel: 'Verifying...',\n onSubmit: {\n type: 'api',\n config: { endpointId: 'mock-login-otp', body: 'formValue' },\n then: {\n type: 'dispatch-multiple',\n config: {\n mode: 'parallel',\n actions: [\n { type: 'notify', config: { type: 'success', message: 'OTP Verified! Redirecting...' } },\n { type: 'close-modal' },\n { \n type: 'delay', \n config: { duration: 600 }, \n then: { type: 'navigate', config: { path: '/dashboard' } } \n }\n ]\n }\n },\n onError: { type: 'notify', config: { type: 'error', message: 'Invalid Verification Code' } }\n }\n }\n }\n }\n });\n }, 1200);\n }\n}\n"],"names":["i2"],"mappings":"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"}