@avora-labs/meta-forge 1.0.5 → 1.0.6

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 +112 -63
  2. package/fesm2022/{avora-labs-meta-forge-amf-auth-shell.component-BWSdjBUS.mjs → avora-labs-meta-forge-amf-auth-shell.component-FCubZyZ1.mjs} +57 -57
  3. package/fesm2022/avora-labs-meta-forge-amf-auth-shell.component-FCubZyZ1.mjs.map +1 -0
  4. package/fesm2022/{avora-labs-meta-forge-contact-support.page-BAUiKm3P.mjs → avora-labs-meta-forge-contact-support.page-CgcSAr0x.mjs} +146 -146
  5. package/fesm2022/avora-labs-meta-forge-contact-support.page-CgcSAr0x.mjs.map +1 -0
  6. package/fesm2022/{avora-labs-meta-forge-forgot-password.page-0XLiBrV1.mjs → avora-labs-meta-forge-forgot-password.page-CWdWX-mj.mjs} +238 -238
  7. package/fesm2022/avora-labs-meta-forge-forgot-password.page-CWdWX-mj.mjs.map +1 -0
  8. package/fesm2022/{avora-labs-meta-forge-login.page-etTr5NqJ.mjs → avora-labs-meta-forge-login.page-LCW-ofz1.mjs} +74 -74
  9. package/fesm2022/avora-labs-meta-forge-login.page-LCW-ofz1.mjs.map +1 -0
  10. package/fesm2022/avora-labs-meta-forge.mjs +1995 -1995
  11. package/fesm2022/avora-labs-meta-forge.mjs.map +1 -1
  12. package/package.json +3 -1
  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
@@ -4,7 +4,7 @@ import { FormsModule } from '@angular/forms';
4
4
  import * as i1 from '@angular/router';
5
5
  import { RouterModule } from '@angular/router';
6
6
  import { ActionDispatcherService, APP_META_CONFIG_TOKEN, FormRendererComponent } from './avora-labs-meta-forge.mjs';
7
- import { A as AmfAuthShellComponent } from './avora-labs-meta-forge-amf-auth-shell.component-BWSdjBUS.mjs';
7
+ import { A as AmfAuthShellComponent } from './avora-labs-meta-forge-amf-auth-shell.component-FCubZyZ1.mjs';
8
8
 
9
9
  /**
10
10
  * Contact Support Component
@@ -132,156 +132,156 @@ class ContactSupportComponent {
132
132
  }).finally(() => this.loading.set(false));
133
133
  }
134
134
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContactSupportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
135
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: ContactSupportComponent, isStandalone: true, selector: "amf-contact-support", ngImport: i0, template: `
136
- <amf-auth-shell
137
- [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
138
- [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'We\\'re here to help'"
139
- maxWidth="660px">
140
- <!-- Compact header: icon inline with title -->
141
- <div class="cs-header">
142
- <span class="ms icon-ms">support_agent</span>
143
- <div class="cs-header-text">
144
- <h2>Contact Support</h2>
145
- <p>Choose the fastest way to reach us. We typically respond within 2 hours.</p>
146
- </div>
147
- </div>
148
-
149
- <!-- Contact Channel Cards — inline 3-col grid -->
150
- <div class="channels">
151
- @for (channel of channels; track channel.id) {
152
- <button
153
- class="channel-card"
154
- [id]="'cs-' + channel.id"
155
- (click)="channel.action()"
156
- [class.active]="activeChannel === channel.id"
157
- >
158
- <div class="channel-icon" [style.background]="channel.gradient">
159
- <span class="ms channel-icon-ms">{{ channel.icon }}</span>
160
- </div>
161
- <div class="channel-title">{{ channel.title }}</div>
162
- @if (channel.badge) {
163
- <span class="badge">{{ channel.badge }}</span>
164
- }
165
- </button>
166
- }
167
- </div>
168
-
169
- <!-- Quick Message Form -->
170
- <div class="quick-msg">
171
- <div class="divider"><span>or send a quick message</span></div>
172
-
173
- <!-- Form + actions unified container -->
174
- <div class="cs-form-body">
175
- <div class="msg-form-container">
176
- <amf-form-renderer
177
- [config]="supportForm"
178
- (formSubmit)="onFormSubmit($event)"
179
- (formChange)="onFormChange($event)">
180
- </amf-form-renderer>
181
- </div>
182
-
183
- @if (successTicket()) {
184
- <div class="success-banner">
185
- <span class="ms" style="font-size:1.1rem;vertical-align:middle;margin-right:6px">check_circle</span>
186
- Ticket <strong>{{ ticketId() }}</strong> created! We'll get back to you shortly.
187
- </div>
188
- }
189
-
190
- <div class="action-row">
191
- <button type="button" class="auth-btn" (click)="triggerSubmit()" [disabled]="loading() || !ticketEmail || !ticketMessage || successTicket()">
192
- @if (loading()) {
193
- <div class="loader"></div>
194
- } @else {
195
- <span>Send Message</span>
196
- <svg class="btn-icon" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>
197
- }
198
- </button>
199
- <a routerLink="/login" class="back-link-inline">
200
- &larr; Back to Sign In
201
- </a>
202
- </div>
203
- </div>
204
- </div>
205
-
206
- </amf-auth-shell>
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: ContactSupportComponent, isStandalone: true, selector: "amf-contact-support", ngImport: i0, template: `
136
+ <amf-auth-shell
137
+ [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
138
+ [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'We\\'re here to help'"
139
+ maxWidth="660px">
140
+ <!-- Compact header: icon inline with title -->
141
+ <div class="cs-header">
142
+ <span class="ms icon-ms">support_agent</span>
143
+ <div class="cs-header-text">
144
+ <h2>Contact Support</h2>
145
+ <p>Choose the fastest way to reach us. We typically respond within 2 hours.</p>
146
+ </div>
147
+ </div>
148
+
149
+ <!-- Contact Channel Cards — inline 3-col grid -->
150
+ <div class="channels">
151
+ @for (channel of channels; track channel.id) {
152
+ <button
153
+ class="channel-card"
154
+ [id]="'cs-' + channel.id"
155
+ (click)="channel.action()"
156
+ [class.active]="activeChannel === channel.id"
157
+ >
158
+ <div class="channel-icon" [style.background]="channel.gradient">
159
+ <span class="ms channel-icon-ms">{{ channel.icon }}</span>
160
+ </div>
161
+ <div class="channel-title">{{ channel.title }}</div>
162
+ @if (channel.badge) {
163
+ <span class="badge">{{ channel.badge }}</span>
164
+ }
165
+ </button>
166
+ }
167
+ </div>
168
+
169
+ <!-- Quick Message Form -->
170
+ <div class="quick-msg">
171
+ <div class="divider"><span>or send a quick message</span></div>
172
+
173
+ <!-- Form + actions unified container -->
174
+ <div class="cs-form-body">
175
+ <div class="msg-form-container">
176
+ <amf-form-renderer
177
+ [config]="supportForm"
178
+ (formSubmit)="onFormSubmit($event)"
179
+ (formChange)="onFormChange($event)">
180
+ </amf-form-renderer>
181
+ </div>
182
+
183
+ @if (successTicket()) {
184
+ <div class="success-banner">
185
+ <span class="ms" style="font-size:1.1rem;vertical-align:middle;margin-right:6px">check_circle</span>
186
+ Ticket <strong>{{ ticketId() }}</strong> created! We'll get back to you shortly.
187
+ </div>
188
+ }
189
+
190
+ <div class="action-row">
191
+ <button type="button" class="auth-btn" (click)="triggerSubmit()" [disabled]="loading() || !ticketEmail || !ticketMessage || successTicket()">
192
+ @if (loading()) {
193
+ <div class="loader"></div>
194
+ } @else {
195
+ <span>Send Message</span>
196
+ <svg class="btn-icon" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>
197
+ }
198
+ </button>
199
+ <a routerLink="/login" class="back-link-inline">
200
+ &larr; Back to Sign In
201
+ </a>
202
+ </div>
203
+ </div>
204
+ </div>
205
+
206
+ </amf-auth-shell>
207
207
  `, isInline: true, styles: [":host{display:block;height:100%}.cs-header{display:flex;align-items:center;gap:14px;margin-bottom:clamp(12px,2.5vw,20px);padding-bottom:clamp(10px,2vw,16px);border-bottom:1px solid rgba(255,255,255,.07)}.icon-ms{font-size:2.4rem!important;font-variation-settings:\"FILL\" 1,\"wght\" 300,\"GRAD\" 0,\"opsz\" 48;background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;flex-shrink:0}.cs-header-text{flex:1}.cs-header h2{font-size:clamp(1.1rem,3vw,1.35rem);font-weight:700;color:#f1f5f9;margin:0 0 3px}.cs-header p{font-size:clamp(.75rem,1.8vw,.82rem);color:#64748b;margin:0;line-height:1.4}.channels{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:clamp(12px,2.5vw,20px)}.channel-card{display:flex;flex-direction:column;align-items:center;gap:6px;padding:clamp(8px,1.5vw,10px) 4px;background:#ffffff0a;border:1px solid rgba(255,255,255,.07);border-radius:14px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);text-align:center;width:100%;position:relative;overflow:hidden}.channel-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));opacity:0;transition:opacity .25s}.channel-card:hover{border-color:#6366f159;background:#6366f10f;transform:translateY(-3px);box-shadow:0 6px 24px #6366f12e}.channel-card:hover:before{opacity:.04}.channel-card.active{border-color:#6366f180;background:#6366f11a}.channel-icon{width:clamp(28px,6vw,34px);height:clamp(28px,6vw,34px);border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;z-index:1}.channel-icon-ms{font-size:1.15rem!important;font-variation-settings:\"FILL\" 1,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:#fff}.channel-title{font-size:clamp(.7rem,1.5vw,.78rem);font-weight:600;color:#e2e8f0;position:relative;z-index:1;line-height:1.2}.badge{font-size:.55rem;font-weight:700;background:linear-gradient(135deg,#10b981,#059669);color:#fff;padding:1px 5px;border-radius:6px;letter-spacing:.03em;text-transform:uppercase;position:relative;z-index:1;white-space:nowrap}.quick-msg{margin-top:0}.divider{display:flex;align-items:center;gap:12px;margin-bottom:12px;color:#475569;font-size:.78rem}.divider:before,.divider:after{content:\"\";flex:1;height:1px;background:#ffffff12}.cs-form-body{display:flex;flex-direction:column;gap:clamp(10px,2vw,14px)}.msg-form-container{display:flex;flex-direction:column;gap:10px}::ng-deep .msg-form-container .amf-form{gap:16px}::ng-deep .msg-form-container .amf-form-fields{gap:16px;align-items:stretch}::ng-deep .msg-form-container .amf-field{display:flex;flex-direction:column;gap:5px}::ng-deep .msg-form-container .field-label{font-size:.8rem!important;font-weight:600!important;color:#94a3b8!important;margin-bottom:0!important}::ng-deep .msg-form-container .field-input-wrapper{border-radius:12px!important;border:1px solid rgba(255,255,255,.08)!important;background:#ffffff0a!important;transition:all .25s!important;overflow:hidden;box-shadow:none!important;flex:1;display:flex}::ng-deep .msg-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 .msg-form-container .field-input{flex:1;min-width:0;padding:12px!important;border:none!important;background:transparent!important;font-size:clamp(.875rem,2vw,.9375rem)!important;color:#f1f5f9!important;resize:none!important;font-family:inherit!important;width:100%!important;height:100%!important}::ng-deep .msg-form-container .field-input::placeholder{color:#64748b!important}.auth-btn{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));color:#fff;padding:clamp(11px,2.5vw,13px);border:none;border-radius:12px;font-size:clamp(.875rem,2vw,.9375rem);font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;gap:8px}.auth-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 10px 30px -5px var(--app-glow, rgba(99,102,241,.5))}.auth-btn:disabled{opacity:.6;cursor:not-allowed;transform:none}.btn-icon{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.success-banner{background:#10b9811a;border:1px solid rgba(16,185,129,.3);border-radius:12px;padding:14px 16px;font-size:.875rem;color:#6ee7b7;text-align:center;display:flex;align-items:center;justify-content:center;gap:8px}.action-row{display:flex;gap:10px;margin-top:0}.action-row>*{flex:1}.back-link-inline{padding:clamp(12px,2.5vw,15px) 16px;border-radius:12px;font-size:clamp(.875rem,2vw,.9375rem);font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;text-decoration:none;background:#ffffff0a;color:#94a3b8;border:1px solid rgba(255,255,255,.1)}.back-link-inline:hover{background:#ffffff14;color:#fff}.loader{width:18px;height:18px;border:2.5px solid rgba(255,255,255,.2);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}@media(max-width:400px){.channels{grid-template-columns:1fr}.channel-card{flex-direction:row;text-align:left;gap:10px}}@media(max-width:500px){.cs-header{flex-direction:column;text-align:center;gap:8px}.cs-header-text{text-align:center}}@media(prefers-reduced-motion:reduce){.icon-wrap,.channel-card{animation:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { 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"] }] });
208
208
  }
209
209
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: ContactSupportComponent, decorators: [{
210
210
  type: Component,
211
- args: [{ selector: 'amf-contact-support', standalone: true, imports: [FormsModule, RouterModule, AmfAuthShellComponent, FormRendererComponent], template: `
212
- <amf-auth-shell
213
- [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
214
- [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'We\\'re here to help'"
215
- maxWidth="660px">
216
- <!-- Compact header: icon inline with title -->
217
- <div class="cs-header">
218
- <span class="ms icon-ms">support_agent</span>
219
- <div class="cs-header-text">
220
- <h2>Contact Support</h2>
221
- <p>Choose the fastest way to reach us. We typically respond within 2 hours.</p>
222
- </div>
223
- </div>
224
-
225
- <!-- Contact Channel Cards — inline 3-col grid -->
226
- <div class="channels">
227
- @for (channel of channels; track channel.id) {
228
- <button
229
- class="channel-card"
230
- [id]="'cs-' + channel.id"
231
- (click)="channel.action()"
232
- [class.active]="activeChannel === channel.id"
233
- >
234
- <div class="channel-icon" [style.background]="channel.gradient">
235
- <span class="ms channel-icon-ms">{{ channel.icon }}</span>
236
- </div>
237
- <div class="channel-title">{{ channel.title }}</div>
238
- @if (channel.badge) {
239
- <span class="badge">{{ channel.badge }}</span>
240
- }
241
- </button>
242
- }
243
- </div>
244
-
245
- <!-- Quick Message Form -->
246
- <div class="quick-msg">
247
- <div class="divider"><span>or send a quick message</span></div>
248
-
249
- <!-- Form + actions unified container -->
250
- <div class="cs-form-body">
251
- <div class="msg-form-container">
252
- <amf-form-renderer
253
- [config]="supportForm"
254
- (formSubmit)="onFormSubmit($event)"
255
- (formChange)="onFormChange($event)">
256
- </amf-form-renderer>
257
- </div>
258
-
259
- @if (successTicket()) {
260
- <div class="success-banner">
261
- <span class="ms" style="font-size:1.1rem;vertical-align:middle;margin-right:6px">check_circle</span>
262
- Ticket <strong>{{ ticketId() }}</strong> created! We'll get back to you shortly.
263
- </div>
264
- }
265
-
266
- <div class="action-row">
267
- <button type="button" class="auth-btn" (click)="triggerSubmit()" [disabled]="loading() || !ticketEmail || !ticketMessage || successTicket()">
268
- @if (loading()) {
269
- <div class="loader"></div>
270
- } @else {
271
- <span>Send Message</span>
272
- <svg class="btn-icon" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>
273
- }
274
- </button>
275
- <a routerLink="/login" class="back-link-inline">
276
- &larr; Back to Sign In
277
- </a>
278
- </div>
279
- </div>
280
- </div>
281
-
282
- </amf-auth-shell>
211
+ args: [{ selector: 'amf-contact-support', standalone: true, imports: [FormsModule, RouterModule, AmfAuthShellComponent, FormRendererComponent], template: `
212
+ <amf-auth-shell
213
+ [brandName]="meta.auth?.builtInUI?.brandName || meta.app.name"
214
+ [brandTagline]="meta.auth?.builtInUI?.brandTagline || 'We\\'re here to help'"
215
+ maxWidth="660px">
216
+ <!-- Compact header: icon inline with title -->
217
+ <div class="cs-header">
218
+ <span class="ms icon-ms">support_agent</span>
219
+ <div class="cs-header-text">
220
+ <h2>Contact Support</h2>
221
+ <p>Choose the fastest way to reach us. We typically respond within 2 hours.</p>
222
+ </div>
223
+ </div>
224
+
225
+ <!-- Contact Channel Cards — inline 3-col grid -->
226
+ <div class="channels">
227
+ @for (channel of channels; track channel.id) {
228
+ <button
229
+ class="channel-card"
230
+ [id]="'cs-' + channel.id"
231
+ (click)="channel.action()"
232
+ [class.active]="activeChannel === channel.id"
233
+ >
234
+ <div class="channel-icon" [style.background]="channel.gradient">
235
+ <span class="ms channel-icon-ms">{{ channel.icon }}</span>
236
+ </div>
237
+ <div class="channel-title">{{ channel.title }}</div>
238
+ @if (channel.badge) {
239
+ <span class="badge">{{ channel.badge }}</span>
240
+ }
241
+ </button>
242
+ }
243
+ </div>
244
+
245
+ <!-- Quick Message Form -->
246
+ <div class="quick-msg">
247
+ <div class="divider"><span>or send a quick message</span></div>
248
+
249
+ <!-- Form + actions unified container -->
250
+ <div class="cs-form-body">
251
+ <div class="msg-form-container">
252
+ <amf-form-renderer
253
+ [config]="supportForm"
254
+ (formSubmit)="onFormSubmit($event)"
255
+ (formChange)="onFormChange($event)">
256
+ </amf-form-renderer>
257
+ </div>
258
+
259
+ @if (successTicket()) {
260
+ <div class="success-banner">
261
+ <span class="ms" style="font-size:1.1rem;vertical-align:middle;margin-right:6px">check_circle</span>
262
+ Ticket <strong>{{ ticketId() }}</strong> created! We'll get back to you shortly.
263
+ </div>
264
+ }
265
+
266
+ <div class="action-row">
267
+ <button type="button" class="auth-btn" (click)="triggerSubmit()" [disabled]="loading() || !ticketEmail || !ticketMessage || successTicket()">
268
+ @if (loading()) {
269
+ <div class="loader"></div>
270
+ } @else {
271
+ <span>Send Message</span>
272
+ <svg class="btn-icon" viewBox="0 0 24 24"><path d="M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z"/></svg>
273
+ }
274
+ </button>
275
+ <a routerLink="/login" class="back-link-inline">
276
+ &larr; Back to Sign In
277
+ </a>
278
+ </div>
279
+ </div>
280
+ </div>
281
+
282
+ </amf-auth-shell>
283
283
  `, styles: [":host{display:block;height:100%}.cs-header{display:flex;align-items:center;gap:14px;margin-bottom:clamp(12px,2.5vw,20px);padding-bottom:clamp(10px,2vw,16px);border-bottom:1px solid rgba(255,255,255,.07)}.icon-ms{font-size:2.4rem!important;font-variation-settings:\"FILL\" 1,\"wght\" 300,\"GRAD\" 0,\"opsz\" 48;background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;flex-shrink:0}.cs-header-text{flex:1}.cs-header h2{font-size:clamp(1.1rem,3vw,1.35rem);font-weight:700;color:#f1f5f9;margin:0 0 3px}.cs-header p{font-size:clamp(.75rem,1.8vw,.82rem);color:#64748b;margin:0;line-height:1.4}.channels{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:clamp(12px,2.5vw,20px)}.channel-card{display:flex;flex-direction:column;align-items:center;gap:6px;padding:clamp(8px,1.5vw,10px) 4px;background:#ffffff0a;border:1px solid rgba(255,255,255,.07);border-radius:14px;cursor:pointer;transition:all .25s cubic-bezier(.4,0,.2,1);text-align:center;width:100%;position:relative;overflow:hidden}.channel-card:before{content:\"\";position:absolute;inset:0;background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));opacity:0;transition:opacity .25s}.channel-card:hover{border-color:#6366f159;background:#6366f10f;transform:translateY(-3px);box-shadow:0 6px 24px #6366f12e}.channel-card:hover:before{opacity:.04}.channel-card.active{border-color:#6366f180;background:#6366f11a}.channel-icon{width:clamp(28px,6vw,34px);height:clamp(28px,6vw,34px);border-radius:10px;display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;z-index:1}.channel-icon-ms{font-size:1.15rem!important;font-variation-settings:\"FILL\" 1,\"wght\" 400,\"GRAD\" 0,\"opsz\" 24;color:#fff}.channel-title{font-size:clamp(.7rem,1.5vw,.78rem);font-weight:600;color:#e2e8f0;position:relative;z-index:1;line-height:1.2}.badge{font-size:.55rem;font-weight:700;background:linear-gradient(135deg,#10b981,#059669);color:#fff;padding:1px 5px;border-radius:6px;letter-spacing:.03em;text-transform:uppercase;position:relative;z-index:1;white-space:nowrap}.quick-msg{margin-top:0}.divider{display:flex;align-items:center;gap:12px;margin-bottom:12px;color:#475569;font-size:.78rem}.divider:before,.divider:after{content:\"\";flex:1;height:1px;background:#ffffff12}.cs-form-body{display:flex;flex-direction:column;gap:clamp(10px,2vw,14px)}.msg-form-container{display:flex;flex-direction:column;gap:10px}::ng-deep .msg-form-container .amf-form{gap:16px}::ng-deep .msg-form-container .amf-form-fields{gap:16px;align-items:stretch}::ng-deep .msg-form-container .amf-field{display:flex;flex-direction:column;gap:5px}::ng-deep .msg-form-container .field-label{font-size:.8rem!important;font-weight:600!important;color:#94a3b8!important;margin-bottom:0!important}::ng-deep .msg-form-container .field-input-wrapper{border-radius:12px!important;border:1px solid rgba(255,255,255,.08)!important;background:#ffffff0a!important;transition:all .25s!important;overflow:hidden;box-shadow:none!important;flex:1;display:flex}::ng-deep .msg-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 .msg-form-container .field-input{flex:1;min-width:0;padding:12px!important;border:none!important;background:transparent!important;font-size:clamp(.875rem,2vw,.9375rem)!important;color:#f1f5f9!important;resize:none!important;font-family:inherit!important;width:100%!important;height:100%!important}::ng-deep .msg-form-container .field-input::placeholder{color:#64748b!important}.auth-btn{background:linear-gradient(135deg,var(--app-primary, #6366f1),var(--app-accent, #c084fc));color:#fff;padding:clamp(11px,2.5vw,13px);border:none;border-radius:12px;font-size:clamp(.875rem,2vw,.9375rem);font-weight:600;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;gap:8px}.auth-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 10px 30px -5px var(--app-glow, rgba(99,102,241,.5))}.auth-btn:disabled{opacity:.6;cursor:not-allowed;transform:none}.btn-icon{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}.success-banner{background:#10b9811a;border:1px solid rgba(16,185,129,.3);border-radius:12px;padding:14px 16px;font-size:.875rem;color:#6ee7b7;text-align:center;display:flex;align-items:center;justify-content:center;gap:8px}.action-row{display:flex;gap:10px;margin-top:0}.action-row>*{flex:1}.back-link-inline{padding:clamp(12px,2.5vw,15px) 16px;border-radius:12px;font-size:clamp(.875rem,2vw,.9375rem);font-weight:600;transition:all .3s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;justify-content:center;text-decoration:none;background:#ffffff0a;color:#94a3b8;border:1px solid rgba(255,255,255,.1)}.back-link-inline:hover{background:#ffffff14;color:#fff}.loader{width:18px;height:18px;border:2.5px solid rgba(255,255,255,.2);border-top-color:#fff;border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-6px)}}@media(max-width:400px){.channels{grid-template-columns:1fr}.channel-card{flex-direction:row;text-align:left;gap:10px}}@media(max-width:500px){.cs-header{flex-direction:column;text-align:center;gap:8px}.cs-header-text{text-align:center}}@media(prefers-reduced-motion:reduce){.icon-wrap,.channel-card{animation:none!important}}\n"] }]
284
284
  }] });
285
285
 
286
286
  export { ContactSupportComponent };
287
- //# sourceMappingURL=avora-labs-meta-forge-contact-support.page-BAUiKm3P.mjs.map
287
+ //# sourceMappingURL=avora-labs-meta-forge-contact-support.page-CgcSAr0x.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avora-labs-meta-forge-contact-support.page-CgcSAr0x.mjs","sources":["../../../projects/avora-meta-forge/src/lib/avora-meta-forge/pages/auth/contact-support.page.ts"],"sourcesContent":["/**\n * Contact Support Component\n *\n * A full-page, bookmarkable /contact-support route built with AmfAuthShellComponent.\n * Displays three contact channel cards:\n * - Email Support (mailto)\n * - Live Chat (extensible — can wire to any chat provider)\n * - Documentation (external URL)\n *\n * Optionally allows submitting a support ticket with a message, powered by\n * the mock-contact-support endpoint (replace with real endpoint in production).\n */\nimport { Component, inject, signal } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { RouterModule } from '@angular/router';\n\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';\ninterface ContactChannel {\n id: string;\n icon: string;\n gradient: string;\n title: string;\n subtitle: string;\n badge?: string;\n action: () => void;\n}\n\n@Component({\n selector: 'amf-contact-support',\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 || 'We\\\\'re here to help'\" \n maxWidth=\"660px\">\n <!-- Compact header: icon inline with title -->\n <div class=\"cs-header\">\n <span class=\"ms icon-ms\">support_agent</span>\n <div class=\"cs-header-text\">\n <h2>Contact Support</h2>\n <p>Choose the fastest way to reach us. We typically respond within 2 hours.</p>\n </div>\n </div>\n\n <!-- Contact Channel Cards — inline 3-col grid -->\n <div class=\"channels\">\n @for (channel of channels; track channel.id) {\n <button\n class=\"channel-card\"\n [id]=\"'cs-' + channel.id\"\n (click)=\"channel.action()\"\n [class.active]=\"activeChannel === channel.id\"\n >\n <div class=\"channel-icon\" [style.background]=\"channel.gradient\">\n <span class=\"ms channel-icon-ms\">{{ channel.icon }}</span>\n </div>\n <div class=\"channel-title\">{{ channel.title }}</div>\n @if (channel.badge) {\n <span class=\"badge\">{{ channel.badge }}</span>\n }\n </button>\n }\n </div>\n\n <!-- Quick Message Form -->\n <div class=\"quick-msg\">\n <div class=\"divider\"><span>or send a quick message</span></div>\n\n <!-- Form + actions unified container -->\n <div class=\"cs-form-body\">\n <div class=\"msg-form-container\">\n <amf-form-renderer \n [config]=\"supportForm\" \n (formSubmit)=\"onFormSubmit($event)\"\n (formChange)=\"onFormChange($event)\">\n </amf-form-renderer>\n </div>\n\n @if (successTicket()) {\n <div class=\"success-banner\">\n <span class=\"ms\" style=\"font-size:1.1rem;vertical-align:middle;margin-right:6px\">check_circle</span>\n Ticket <strong>{{ ticketId() }}</strong> created! We'll get back to you shortly.\n </div>\n }\n \n <div class=\"action-row\">\n <button type=\"button\" class=\"auth-btn\" (click)=\"triggerSubmit()\" [disabled]=\"loading() || !ticketEmail || !ticketMessage || successTicket()\">\n @if (loading()) {\n <div class=\"loader\"></div>\n } @else {\n <span>Send Message</span>\n <svg class=\"btn-icon\" viewBox=\"0 0 24 24\"><path d=\"M22 2L11 13M22 2l-7 20-4-9-9-4 20-7z\"/></svg>\n }\n </button>\n <a routerLink=\"/login\" class=\"back-link-inline\">\n &larr; Back to Sign In\n </a>\n </div>\n </div>\n </div>\n\n </amf-auth-shell>\n `,\n styles: [`\n :host { display: block; height: 100%; }\n\n /* ── Header — compact inline row ── */\n .cs-header {\n display: flex;\n align-items: center;\n gap: 14px;\n margin-bottom: clamp(12px, 2.5vw, 20px);\n padding-bottom: clamp(10px, 2vw, 16px);\n border-bottom: 1px solid rgba(255,255,255,0.07);\n }\n .icon-ms {\n font-size: 2.4rem !important;\n font-variation-settings: 'FILL' 1, 'wght' 300, 'GRAD' 0, 'opsz' 48;\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n background-clip: text;\n flex-shrink: 0;\n }\n .cs-header-text { flex: 1; }\n .cs-header h2 {\n font-size: clamp(1.1rem, 3vw, 1.35rem);\n font-weight: 700;\n color: #f1f5f9;\n margin: 0 0 3px;\n }\n .cs-header p {\n font-size: clamp(0.75rem, 1.8vw, 0.82rem);\n color: #64748b;\n margin: 0;\n line-height: 1.4;\n }\n\n /* ── Channel Cards — inline 3-col grid ── */\n .channels {\n display: grid;\n grid-template-columns: repeat(3, 1fr);\n gap: 10px;\n margin-bottom: clamp(12px, 2.5vw, 20px);\n }\n\n .channel-card {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n padding: clamp(8px, 1.5vw, 10px) 4px;\n background: rgba(255,255,255,0.04);\n border: 1px solid rgba(255,255,255,0.07);\n border-radius: 14px;\n cursor: pointer;\n transition: all 0.25s cubic-bezier(0.4,0,0.2,1);\n text-align: center;\n width: 100%;\n position: relative;\n overflow: hidden;\n }\n .channel-card::before {\n content: '';\n position: absolute;\n inset: 0;\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n opacity: 0;\n transition: opacity 0.25s;\n }\n .channel-card:hover {\n border-color: rgba(99,102,241,0.35);\n background: rgba(99,102,241,0.06);\n transform: translateY(-3px);\n box-shadow: 0 6px 24px rgba(99,102,241,0.18);\n }\n .channel-card:hover::before { opacity: 0.04; }\n .channel-card.active {\n border-color: rgba(99,102,241,0.5);\n background: rgba(99,102,241,0.1);\n }\n\n .channel-icon {\n width: clamp(28px, 6vw, 34px);\n height: clamp(28px, 6vw, 34px);\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n position: relative;\n z-index: 1;\n }\n .channel-icon-ms {\n font-size: 1.15rem !important;\n font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 24;\n color: white;\n }\n .channel-title {\n font-size: clamp(0.7rem, 1.5vw, 0.78rem);\n font-weight: 600;\n color: #e2e8f0;\n position: relative;\n z-index: 1;\n line-height: 1.2;\n }\n .badge {\n font-size: 0.55rem;\n font-weight: 700;\n background: linear-gradient(135deg, #10b981, #059669);\n color: white;\n padding: 1px 5px;\n border-radius: 6px;\n letter-spacing: 0.03em;\n text-transform: uppercase;\n position: relative;\n z-index: 1;\n white-space: nowrap;\n }\n\n /* ── Quick Message ── */\n .quick-msg { margin-top: 0; }\n .divider {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 12px;\n color: #475569;\n font-size: 0.78rem;\n }\n .divider::before, .divider::after {\n content: '';\n flex: 1;\n height: 1px;\n background: rgba(255,255,255,0.07);\n }\n\n /* Unified form + actions container — mirrors .auth-form-container in forgot-password */\n .cs-form-body { display: flex; flex-direction: column; gap: clamp(10px, 2vw, 14px); }\n\n /* Two-field inline row for wider layout */\n .msg-form-container { display: flex; flex-direction: column; gap: 10px; }\n \n ::ng-deep .msg-form-container .amf-form { gap: 16px; }\n ::ng-deep .msg-form-container .amf-form-fields { gap: 16px; align-items: stretch; }\n ::ng-deep .msg-form-container .amf-field { display: flex; flex-direction: column; gap: 5px; }\n ::ng-deep .msg-form-container .field-label {\n font-size: 0.8rem !important;\n font-weight: 600 !important;\n color: #94a3b8 !important;\n margin-bottom: 0 !important;\n }\n ::ng-deep .msg-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.25s !important;\n overflow: hidden;\n box-shadow: none !important;\n flex: 1;\n display: flex;\n }\n ::ng-deep .msg-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 .msg-form-container .field-input {\n flex: 1;\n min-width: 0;\n padding: 12px 12px !important;\n border: none !important;\n background: transparent !important;\n font-size: clamp(0.875rem, 2vw, 0.9375rem) !important;\n color: #f1f5f9 !important;\n resize: none !important;\n font-family: inherit !important;\n width: 100% !important;\n height: 100% !important;\n }\n ::ng-deep .msg-form-container .field-input::placeholder { color: #64748b !important; }\n\n /* ── Button ── */\n .auth-btn {\n background: linear-gradient(135deg, var(--app-primary, #6366f1), var(--app-accent, #c084fc));\n color: white;\n padding: clamp(11px, 2.5vw, 13px);\n border: none;\n border-radius: 12px;\n font-size: clamp(0.875rem, 2vw, 0.9375rem);\n font-weight: 600;\n cursor: pointer;\n transition: all 0.3s cubic-bezier(0.4,0,0.2,1);\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n .auth-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 10px 30px -5px var(--app-glow, rgba(99,102,241,0.5));\n }\n .auth-btn:disabled { opacity: 0.6; cursor: not-allowed; transform: none; }\n .btn-icon {\n width: 15px; height: 15px;\n fill: none; stroke: currentColor; stroke-width: 2.5;\n stroke-linecap: round; stroke-linejoin: round;\n flex-shrink: 0;\n }\n\n /* ── Success Banner ── */\n .success-banner {\n background: rgba(16,185,129,0.1);\n border: 1px solid rgba(16,185,129,0.3);\n border-radius: 12px;\n padding: 14px 16px;\n font-size: 0.875rem;\n color: #6ee7b7;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n /* ── Action Row ── */\n .action-row {\n display: flex;\n gap: 10px;\n margin-top: 0; /* spacing handled by .cs-form-body gap */\n }\n .action-row > * {\n flex: 1;\n }\n .back-link-inline {\n padding: clamp(12px, 2.5vw, 15px) 16px;\n border-radius: 12px;\n font-size: clamp(0.875rem, 2vw, 0.9375rem);\n font-weight: 600;\n transition: all 0.3s cubic-bezier(0.4,0,0.2,1);\n display: flex;\n align-items: center;\n justify-content: center;\n text-decoration: none;\n background: rgba(255,255,255,0.04);\n color: #94a3b8;\n border: 1px solid rgba(255,255,255,0.1);\n }\n .back-link-inline:hover {\n background: rgba(255,255,255,0.08);\n color: white;\n }\n .loader {\n width: 18px; height: 18px;\n border: 2.5px solid rgba(255,255,255,0.2);\n border-top-color: white;\n border-radius: 50%;\n animation: spin 0.8s linear infinite;\n }\n @keyframes spin { to { transform: rotate(360deg); } }\n @keyframes float {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-6px); }\n }\n\n /* ── Responsive: stack 3-col to single col on small screens ── */\n @media (max-width: 400px) {\n .channels { grid-template-columns: 1fr; }\n .channel-card { flex-direction: row; text-align: left; gap: 10px; }\n /* Kept .form-row as 2 columns per user request */\n }\n @media (max-width: 500px) {\n .cs-header { flex-direction: column; text-align: center; gap: 8px; }\n .cs-header-text { text-align: center; }\n }\n @media (prefers-reduced-motion: reduce) {\n .icon-wrap, .channel-card { animation: none !important; }\n }\n `]\n})\nexport class ContactSupportComponent {\n private readonly dispatcher = inject(ActionDispatcherService);\n protected meta: any = inject(APP_META_CONFIG_TOKEN, { optional: true }) || { app: { name: 'AvoraMetaForge' } };\n\n loading = signal(false);\n successTicket = signal(false);\n ticketId = signal('');\n activeChannel = '';\n\n ticketEmail = '';\n ticketMessage = '';\n\n supportForm: FormMeta = {\n id: 'supportForm',\n layout: 'vertical',\n hideSubmit: true,\n fields: [\n {\n key: 'email',\n type: 'email',\n label: 'Your Email',\n placeholder: 'name@company.com',\n validators: [{ type: 'required' }]\n },\n {\n key: 'message',\n type: 'textarea',\n label: 'How can we help?',\n placeholder: 'Describe your issue...',\n rows: 3,\n validators: [{ type: 'required' }]\n }\n ]\n };\n\n readonly channels: ContactChannel[] = [\n {\n id: 'email',\n icon: 'mail',\n gradient: 'linear-gradient(135deg, rgba(59,130,246,0.3), rgba(99,102,241,0.3))',\n title: 'Email Support',\n subtitle: 'Detailed help via email • Avg. 2h response',\n badge: 'Recommended',\n action: () => {\n this.activeChannel = 'email';\n // DEMO: opens mailto link. REAL: can open a support ticket form or redirect to helpdesk.\n this.dispatcher.dispatch({\n type: 'open-url',\n config: { url: 'mailto:support@avorametaforge.com?subject=Support Request', target: '_self' }\n });\n }\n },\n {\n id: 'chat',\n icon: 'chat_bubble',\n gradient: 'linear-gradient(135deg, rgba(16,185,129,0.3), rgba(5,150,105,0.3))',\n title: 'Live Chat',\n subtitle: 'Real-time help with our team • Now available',\n action: () => {\n this.activeChannel = 'chat';\n // DEMO: shows a notification. REAL: wire to Intercom, Crisp, Zendesk, etc.\n this.dispatcher.dispatch({\n type: 'notify',\n config: { type: 'info', message: 'Live chat integration is configurable. Wire to Intercom, Crisp, or any provider.' }\n });\n }\n },\n {\n id: 'docs',\n icon: 'menu_book',\n gradient: 'linear-gradient(135deg, rgba(245,158,11,0.3), rgba(217,119,6,0.3))',\n title: 'Documentation',\n subtitle: 'Browse guides, API reference & tutorials',\n action: () => {\n this.activeChannel = 'docs';\n this.dispatcher.dispatch({\n type: 'open-url',\n config: { url: 'https://github.com/AvoraLabs/avora-meta-forge', target: '_blank' }\n });\n }\n }\n ];\n\n onFormChange(values: any): void {\n this.ticketEmail = values.email || '';\n this.ticketMessage = values.message || '';\n }\n\n triggerSubmit(): void {\n this.dispatcher.dispatch({ type: 'submit-form', config: { formId: 'supportForm' } });\n }\n\n onFormSubmit(values: any): void {\n if (!values.email || !values.message) return;\n\n this.loading.set(true);\n\n // DEMO: calls mock-contact-support endpoint.\n // REAL: remove mock:true from 'mock-contact-support' and point to your helpdesk API.\n this.dispatcher.dispatch({\n type: 'api',\n config: {\n endpointId: 'mock-contact-support',\n body: { email: values.email, message: values.message },\n storeResultAs: 'supportResult'\n },\n then: {\n type: 'notify',\n config: { type: 'success', message: 'Your message has been sent! We\\'ll respond to ' + values.email }\n },\n onError: {\n type: 'notify',\n config: { type: 'error', message: 'Failed to send. Please try emailing us directly.' }\n }\n }).then((result: any) => {\n if (result?.ticketId) {\n this.ticketId.set(result.ticketId);\n this.successTicket.set(true);\n }\n }).finally(() => this.loading.set(false));\n }\n}\n"],"names":[],"mappings":"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"}