@memberjunction/ng-feedback 0.0.1 → 5.30.0

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 (38) hide show
  1. package/dist/lib/components/feedback-button.component.d.ts +59 -0
  2. package/dist/lib/components/feedback-button.component.d.ts.map +1 -0
  3. package/dist/lib/components/feedback-button.component.js +108 -0
  4. package/dist/lib/components/feedback-button.component.js.map +1 -0
  5. package/dist/lib/components/feedback-form.component.d.ts +101 -0
  6. package/dist/lib/components/feedback-form.component.d.ts.map +1 -0
  7. package/dist/lib/components/feedback-form.component.js +920 -0
  8. package/dist/lib/components/feedback-form.component.js.map +1 -0
  9. package/dist/lib/feedback.config.d.ts +67 -0
  10. package/dist/lib/feedback.config.d.ts.map +1 -0
  11. package/dist/lib/feedback.config.js +33 -0
  12. package/dist/lib/feedback.config.js.map +1 -0
  13. package/dist/lib/feedback.constants.d.ts +14 -0
  14. package/dist/lib/feedback.constants.d.ts.map +1 -0
  15. package/dist/lib/feedback.constants.js +60 -0
  16. package/dist/lib/feedback.constants.js.map +1 -0
  17. package/dist/lib/feedback.module.d.ts +77 -0
  18. package/dist/lib/feedback.module.d.ts.map +1 -0
  19. package/dist/lib/feedback.module.js +121 -0
  20. package/dist/lib/feedback.module.js.map +1 -0
  21. package/dist/lib/feedback.types.d.ts +73 -0
  22. package/dist/lib/feedback.types.d.ts.map +1 -0
  23. package/dist/lib/feedback.types.js +2 -0
  24. package/dist/lib/feedback.types.js.map +1 -0
  25. package/dist/lib/services/feedback-dialog.service.d.ts +85 -0
  26. package/dist/lib/services/feedback-dialog.service.d.ts.map +1 -0
  27. package/dist/lib/services/feedback-dialog.service.js +177 -0
  28. package/dist/lib/services/feedback-dialog.service.js.map +1 -0
  29. package/dist/lib/services/feedback.service.d.ts +63 -0
  30. package/dist/lib/services/feedback.service.d.ts.map +1 -0
  31. package/dist/lib/services/feedback.service.js +240 -0
  32. package/dist/lib/services/feedback.service.js.map +1 -0
  33. package/dist/public-api.d.ts +9 -0
  34. package/dist/public-api.d.ts.map +1 -0
  35. package/dist/public-api.js +18 -0
  36. package/dist/public-api.js.map +1 -0
  37. package/package.json +37 -7
  38. package/README.md +0 -45
@@ -0,0 +1,59 @@
1
+ import { FeedbackDialogService } from '../services/feedback-dialog.service';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Position options for the floating feedback button
5
+ */
6
+ export type FeedbackButtonPosition = 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left';
7
+ /**
8
+ * Floating feedback button component
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <!-- Basic usage - bottom right corner -->
13
+ * <mj-feedback-button></mj-feedback-button>
14
+ *
15
+ * <!-- With label visible -->
16
+ * <mj-feedback-button [ShowLabel]="true" ButtonText="Report Issue"></mj-feedback-button>
17
+ *
18
+ * <!-- Different position -->
19
+ * <mj-feedback-button Position="bottom-left"></mj-feedback-button>
20
+ * ```
21
+ */
22
+ export declare class FeedbackButtonComponent {
23
+ private dialogService;
24
+ /**
25
+ * Position of the floating button
26
+ */
27
+ Position: FeedbackButtonPosition;
28
+ /**
29
+ * Whether to show the text label
30
+ */
31
+ ShowLabel: boolean;
32
+ /**
33
+ * Button text (shown as tooltip or label)
34
+ */
35
+ ButtonText: string;
36
+ /**
37
+ * Optional callback to get the current page/view name.
38
+ * Use this for apps where URL doesn't reflect navigation (e.g., tab-based apps).
39
+ * @example
40
+ * ```html
41
+ * <mj-feedback-button [CurrentPageProvider]="getCurrentPage"></mj-feedback-button>
42
+ * ```
43
+ * ```typescript
44
+ * getCurrentPage = (): string => {
45
+ * return this.workspaceManager.GetConfiguration()?.tabs
46
+ * .find(t => t.id === this.workspaceManager.GetActiveTabId())?.title || '';
47
+ * };
48
+ * ```
49
+ */
50
+ CurrentPageProvider?: () => string | undefined;
51
+ constructor(dialogService: FeedbackDialogService);
52
+ /**
53
+ * Open the feedback dialog
54
+ */
55
+ OpenFeedbackDialog(): void;
56
+ static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackButtonComponent, never>;
57
+ static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackButtonComponent, "mj-feedback-button", never, { "Position": { "alias": "Position"; "required": false; }; "ShowLabel": { "alias": "ShowLabel"; "required": false; }; "ButtonText": { "alias": "ButtonText"; "required": false; }; "CurrentPageProvider": { "alias": "CurrentPageProvider"; "required": false; }; }, {}, never, never, false, never>;
58
+ }
59
+ //# sourceMappingURL=feedback-button.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-button.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/feedback-button.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;;AAE5E;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,cAAc,GAAG,aAAa,GAAG,WAAW,GAAG,UAAU,CAAC;AAE/F;;;;;;;;;;;;;;GAcG;AACH,qBA4Ea,uBAAuB;IAiChC,OAAO,CAAC,aAAa;IAhCvB;;OAEG;IACM,QAAQ,EAAE,sBAAsB,CAAkB;IAE3D;;OAEG;IACM,SAAS,UAAS;IAE3B;;OAEG;IACM,UAAU,SAAc;IAEjC;;;;;;;;;;;;;OAaG;IACM,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;gBAG9C,aAAa,EAAE,qBAAqB;IAG9C;;OAEG;IACH,kBAAkB,IAAI,IAAI;yCAvCf,uBAAuB;2CAAvB,uBAAuB;CA6CnC"}
@@ -0,0 +1,108 @@
1
+ import { Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "../services/feedback-dialog.service";
4
+ import * as i2 from "@angular/common";
5
+ function FeedbackButtonComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
6
+ i0.ɵɵelementStart(0, "span", 2);
7
+ i0.ɵɵtext(1);
8
+ i0.ɵɵelementEnd();
9
+ } if (rf & 2) {
10
+ const ctx_r0 = i0.ɵɵnextContext();
11
+ i0.ɵɵadvance();
12
+ i0.ɵɵtextInterpolate(ctx_r0.ButtonText);
13
+ } }
14
+ /**
15
+ * Floating feedback button component
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <!-- Basic usage - bottom right corner -->
20
+ * <mj-feedback-button></mj-feedback-button>
21
+ *
22
+ * <!-- With label visible -->
23
+ * <mj-feedback-button [ShowLabel]="true" ButtonText="Report Issue"></mj-feedback-button>
24
+ *
25
+ * <!-- Different position -->
26
+ * <mj-feedback-button Position="bottom-left"></mj-feedback-button>
27
+ * ```
28
+ */
29
+ export class FeedbackButtonComponent {
30
+ dialogService;
31
+ /**
32
+ * Position of the floating button
33
+ */
34
+ Position = 'bottom-right';
35
+ /**
36
+ * Whether to show the text label
37
+ */
38
+ ShowLabel = false;
39
+ /**
40
+ * Button text (shown as tooltip or label)
41
+ */
42
+ ButtonText = 'Feedback';
43
+ /**
44
+ * Optional callback to get the current page/view name.
45
+ * Use this for apps where URL doesn't reflect navigation (e.g., tab-based apps).
46
+ * @example
47
+ * ```html
48
+ * <mj-feedback-button [CurrentPageProvider]="getCurrentPage"></mj-feedback-button>
49
+ * ```
50
+ * ```typescript
51
+ * getCurrentPage = (): string => {
52
+ * return this.workspaceManager.GetConfiguration()?.tabs
53
+ * .find(t => t.id === this.workspaceManager.GetActiveTabId())?.title || '';
54
+ * };
55
+ * ```
56
+ */
57
+ CurrentPageProvider;
58
+ constructor(dialogService) {
59
+ this.dialogService = dialogService;
60
+ }
61
+ /**
62
+ * Open the feedback dialog
63
+ */
64
+ OpenFeedbackDialog() {
65
+ const currentPage = this.CurrentPageProvider?.();
66
+ this.dialogService.OpenFeedbackDialog({
67
+ currentPage
68
+ });
69
+ }
70
+ static ɵfac = function FeedbackButtonComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FeedbackButtonComponent)(i0.ɵɵdirectiveInject(i1.FeedbackDialogService)); };
71
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FeedbackButtonComponent, selectors: [["mj-feedback-button"]], inputs: { Position: "Position", ShowLabel: "ShowLabel", ButtonText: "ButtonText", CurrentPageProvider: "CurrentPageProvider" }, standalone: false, decls: 3, vars: 3, consts: [["type", "button", 1, "feedback-floating-button", 3, "click", "ngClass", "title"], [1, "fas", "fa-comment-dots"], [1, "button-label"]], template: function FeedbackButtonComponent_Template(rf, ctx) { if (rf & 1) {
72
+ i0.ɵɵelementStart(0, "button", 0);
73
+ i0.ɵɵlistener("click", function FeedbackButtonComponent_Template_button_click_0_listener() { return ctx.OpenFeedbackDialog(); });
74
+ i0.ɵɵelement(1, "i", 1);
75
+ i0.ɵɵconditionalCreate(2, FeedbackButtonComponent_Conditional_2_Template, 2, 1, "span", 2);
76
+ i0.ɵɵelementEnd();
77
+ } if (rf & 2) {
78
+ i0.ɵɵproperty("ngClass", "position-" + ctx.Position)("title", ctx.ButtonText);
79
+ i0.ɵɵadvance(2);
80
+ i0.ɵɵconditional(ctx.ShowLabel ? 2 : -1);
81
+ } }, dependencies: [i2.NgClass], styles: [".feedback-floating-button[_ngcontent-%COMP%] {\n position: fixed;\n z-index: 9999;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-4);\n border-radius: var(--mj-space-6);\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border: none;\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: var(--mj-transition-base);\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n font-family: var(--mj-font-family);\n }\n\n .feedback-floating-button[_ngcontent-%COMP%]:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n }\n\n .feedback-floating-button[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n }\n\n .feedback-floating-button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 18px;\n }\n\n .button-label[_ngcontent-%COMP%] {\n white-space: nowrap;\n }\n\n \n\n .position-bottom-right[_ngcontent-%COMP%] {\n bottom: var(--mj-space-6);\n right: var(--mj-space-6);\n }\n\n .position-bottom-left[_ngcontent-%COMP%] {\n bottom: var(--mj-space-6);\n left: var(--mj-space-6);\n }\n\n .position-top-right[_ngcontent-%COMP%] {\n top: var(--mj-space-6);\n right: var(--mj-space-6);\n }\n\n .position-top-left[_ngcontent-%COMP%] {\n top: var(--mj-space-6);\n left: var(--mj-space-6);\n }"] });
82
+ }
83
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FeedbackButtonComponent, [{
84
+ type: Component,
85
+ args: [{ standalone: false, selector: 'mj-feedback-button', template: `
86
+ <button
87
+ class="feedback-floating-button"
88
+ [ngClass]="'position-' + Position"
89
+ (click)="OpenFeedbackDialog()"
90
+ [title]="ButtonText"
91
+ type="button">
92
+ <i class="fas fa-comment-dots"></i>
93
+ @if (ShowLabel) {
94
+ <span class="button-label">{{ ButtonText }}</span>
95
+ }
96
+ </button>
97
+ `, styles: ["\n .feedback-floating-button {\n position: fixed;\n z-index: 9999;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-4);\n border-radius: var(--mj-space-6);\n background: var(--mj-brand-primary);\n color: var(--mj-brand-on-primary);\n border: none;\n cursor: pointer;\n box-shadow: var(--mj-shadow-brand-md);\n transition: var(--mj-transition-base);\n font-size: var(--mj-text-sm);\n font-weight: var(--mj-font-medium);\n font-family: var(--mj-font-family);\n }\n\n .feedback-floating-button:hover {\n background: var(--mj-brand-primary-hover);\n transform: translateY(-2px);\n box-shadow: var(--mj-shadow-lg);\n }\n\n .feedback-floating-button:active {\n transform: translateY(0);\n }\n\n .feedback-floating-button i {\n font-size: 18px;\n }\n\n .button-label {\n white-space: nowrap;\n }\n\n /* Position variants */\n .position-bottom-right {\n bottom: var(--mj-space-6);\n right: var(--mj-space-6);\n }\n\n .position-bottom-left {\n bottom: var(--mj-space-6);\n left: var(--mj-space-6);\n }\n\n .position-top-right {\n top: var(--mj-space-6);\n right: var(--mj-space-6);\n }\n\n .position-top-left {\n top: var(--mj-space-6);\n left: var(--mj-space-6);\n }\n "] }]
98
+ }], () => [{ type: i1.FeedbackDialogService }], { Position: [{
99
+ type: Input
100
+ }], ShowLabel: [{
101
+ type: Input
102
+ }], ButtonText: [{
103
+ type: Input
104
+ }], CurrentPageProvider: [{
105
+ type: Input
106
+ }] }); })();
107
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FeedbackButtonComponent, { className: "FeedbackButtonComponent", filePath: "src/lib/components/feedback-button.component.ts", lineNumber: 100 }); })();
108
+ //# sourceMappingURL=feedback-button.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-button.component.js","sourceRoot":"","sources":["../../../src/lib/components/feedback-button.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;;;;;IAmCzC,+BAA2B;IAAA,YAAgB;IAAA,iBAAO;;;IAAvB,cAAgB;IAAhB,uCAAgB;;AA3BnD;;;;;;;;;;;;;;GAcG;AA6EH,MAAM,OAAO,uBAAuB;IAiCxB;IAhCV;;OAEG;IACM,QAAQ,GAA2B,cAAc,CAAC;IAE3D;;OAEG;IACM,SAAS,GAAG,KAAK,CAAC;IAE3B;;OAEG;IACM,UAAU,GAAG,UAAU,CAAC;IAEjC;;;;;;;;;;;;;OAaG;IACM,mBAAmB,CAA4B;IAExD,YACU,aAAoC;QAApC,kBAAa,GAAb,aAAa,CAAuB;IAC3C,CAAC;IAEJ;;OAEG;IACH,kBAAkB;QAChB,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,EAAE,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC;YACpC,WAAW;SACZ,CAAC,CAAC;IACL,CAAC;iHA5CU,uBAAuB;6DAAvB,uBAAuB;YAxEhC,iCAKgB;YAFd,oGAAS,wBAAoB,IAAC;YAG9B,uBAAmC;YACnC,0FAAiB;YAGnB,iBAAS;;YANP,AAFA,oDAAkC,yBAEd;YAGpB,eAEC;YAFD,wCAEC;;;iFA+DM,uBAAuB;cA5EnC,SAAS;6BACI,KAAK,YACP,oBAAoB,YACpB;;;;;;;;;;;;GAYT;;kBAiEA,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAgBL,KAAK;;kFA9BK,uBAAuB"}
@@ -0,0 +1,101 @@
1
+ import { OnInit, EventEmitter, ChangeDetectorRef } from '@angular/core';
2
+ import { FeedbackSubmission, FeedbackResponse, FeedbackCategory, FeedbackSeverity, FeedbackEnvironment } from '../feedback.types';
3
+ import { FeedbackConfig, FeedbackFieldConfig } from '../feedback.config';
4
+ import { FeedbackService } from '../services/feedback.service';
5
+ import * as i0 from "@angular/core";
6
+ export declare class FeedbackFormComponent implements OnInit {
7
+ config: FeedbackConfig;
8
+ private feedbackService;
9
+ private cdr;
10
+ /** Controls mj-dialog visibility — set by FeedbackDialogService */
11
+ DialogVisible: boolean;
12
+ PrefilledCategory?: FeedbackCategory | string;
13
+ PrefilledTitle?: string;
14
+ ContextData?: Record<string, unknown>;
15
+ /** Current page/view name (for apps where URL doesn't reflect navigation) */
16
+ CurrentPage?: string;
17
+ Submitted: EventEmitter<FeedbackSubmission>;
18
+ Success: EventEmitter<FeedbackResponse>;
19
+ Error: EventEmitter<Error>;
20
+ Cancelled: EventEmitter<void>;
21
+ DialogClosed: EventEmitter<{
22
+ success: boolean;
23
+ }>;
24
+ Category: string;
25
+ Title: string;
26
+ Description: string;
27
+ StepsToReproduce: string;
28
+ ExpectedBehavior: string;
29
+ ActualBehavior: string;
30
+ Severity: FeedbackSeverity;
31
+ UseCase: string;
32
+ ProposedSolution: string;
33
+ Environment: FeedbackEnvironment | '';
34
+ AffectedArea: string;
35
+ Name: string;
36
+ Email: string;
37
+ IsSubmitting: boolean;
38
+ IsClassifying: boolean;
39
+ WasAutoClassified: boolean;
40
+ SubmissionSuccess: boolean;
41
+ ErrorMessage: string;
42
+ private lastClassifiedTitle;
43
+ private lastClassifiedDescription;
44
+ IssueNumber?: number;
45
+ IssueUrl?: string;
46
+ ScreenshotDataUrl?: string;
47
+ ScreenshotIncluded: boolean;
48
+ IsCapturingScreenshot: boolean;
49
+ CertificationAccepted: boolean;
50
+ private classifyTimeout?;
51
+ FieldConfig: Required<FeedbackFieldConfig>;
52
+ constructor(config: FeedbackConfig, feedbackService: FeedbackService, cdr: ChangeDetectorRef);
53
+ ngOnInit(): void;
54
+ /**
55
+ * User opts in to include the screenshot
56
+ */
57
+ IncludeScreenshot(): void;
58
+ /**
59
+ * Remove the attached screenshot (opt back out)
60
+ */
61
+ RemoveScreenshot(): void;
62
+ /**
63
+ * Handle field value changes to ensure button state updates.
64
+ * Triggers LLM auto-classification after a debounce when description is long enough.
65
+ */
66
+ OnFieldChange(): void;
67
+ /**
68
+ * Schedule LLM classification with debounce (1 second after user stops typing)
69
+ */
70
+ private scheduleClassification;
71
+ /**
72
+ * Run LLM classification and apply suggestions
73
+ */
74
+ private runClassification;
75
+ /**
76
+ * Check if form is valid for submission
77
+ */
78
+ CanSubmit(): boolean;
79
+ /**
80
+ * Submit the feedback
81
+ */
82
+ OnSubmit(): Promise<void>;
83
+ /**
84
+ * Build the feedback submission object from current form state
85
+ */
86
+ private buildSubmission;
87
+ private applyBugFields;
88
+ private applyFeatureFields;
89
+ private applyOptionalFields;
90
+ /**
91
+ * Cancel and close the dialog
92
+ */
93
+ OnCancel(): void;
94
+ /**
95
+ * Reset the form
96
+ */
97
+ Reset(): void;
98
+ static ɵfac: i0.ɵɵFactoryDeclaration<FeedbackFormComponent, never>;
99
+ static ɵcmp: i0.ɵɵComponentDeclaration<FeedbackFormComponent, "mj-feedback-form", never, { "PrefilledCategory": { "alias": "PrefilledCategory"; "required": false; }; "PrefilledTitle": { "alias": "PrefilledTitle"; "required": false; }; "ContextData": { "alias": "ContextData"; "required": false; }; "CurrentPage": { "alias": "CurrentPage"; "required": false; }; }, { "Submitted": "Submitted"; "Success": "Success"; "Error": "Error"; "Cancelled": "Cancelled"; "DialogClosed": "DialogClosed"; }, never, never, true, never>;
100
+ }
101
+ //# sourceMappingURL=feedback-form.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-form.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/feedback-form.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAiB,YAAY,EAAU,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE1G,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAClI,OAAO,EAAE,cAAc,EAAmB,mBAAmB,EAAoB,MAAM,oBAAoB,CAAC;AAC5G,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAI/D,qBA6ea,qBAAsB,YAAW,MAAM;IAsDhB,MAAM,EAAE,cAAc;IACtD,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,GAAG;IAvDb,mEAAmE;IACnE,aAAa,UAAQ;IAGZ,iBAAiB,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C,6EAA6E;IACpE,WAAW,CAAC,EAAE,MAAM,CAAC;IAGpB,SAAS,mCAA0C;IACnD,OAAO,iCAAwC;IAC/C,KAAK,sBAA6B;IAClC,SAAS,qBAA4B;IACrC,YAAY;iBAA+B,OAAO;OAAM;IAGlE,QAAQ,EAAE,MAAM,CAAS;IACzB,KAAK,EAAE,MAAM,CAAM;IACnB,WAAW,EAAE,MAAM,CAAM;IACzB,gBAAgB,EAAE,MAAM,CAAM;IAC9B,gBAAgB,EAAE,MAAM,CAAM;IAC9B,cAAc,EAAE,MAAM,CAAM;IAC5B,QAAQ,EAAE,gBAAgB,CAAW;IACrC,OAAO,EAAE,MAAM,CAAM;IACrB,gBAAgB,EAAE,MAAM,CAAM;IAC9B,WAAW,EAAE,mBAAmB,GAAG,EAAE,CAAM;IAC3C,YAAY,EAAE,MAAM,CAAM;IAC1B,IAAI,EAAE,MAAM,CAAM;IAClB,KAAK,EAAE,MAAM,CAAM;IAInB,YAAY,UAAS;IACrB,aAAa,UAAS;IACtB,iBAAiB,UAAS;IAC1B,iBAAiB,UAAS;IAC1B,YAAY,SAAM;IAClB,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,yBAAyB,CAAM;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,UAAS;IAC3B,qBAAqB,UAAQ;IAC7B,qBAAqB,UAAS;IAC9B,OAAO,CAAC,eAAe,CAAC,CAAgC;IAGxD,WAAW,EAAE,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAGT,MAAM,EAAE,cAAc,EAC9C,eAAe,EAAE,eAAe,EAChC,GAAG,EAAE,iBAAiB;IAKhC,QAAQ,IAAI,IAAI;IAehB;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAWzB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAQxB;;;OAGG;IACH,aAAa,IAAI,IAAI;IAKrB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAU9B;;OAEG;YACW,iBAAiB;IAyB/B;;OAEG;IACH,SAAS,IAAI,OAAO;IAgBpB;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC/B;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,mBAAmB;IAe3B;;OAEG;IACH,QAAQ,IAAI,IAAI;IAMhB;;OAEG;IACH,KAAK,IAAI,IAAI;yCA3RF,qBAAqB;2CAArB,qBAAqB;CAySjC"}