@memberjunction/ng-base-forms 4.0.0 → 4.2.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 (77) hide show
  1. package/dist/lib/base-form-component.d.ts +103 -215
  2. package/dist/lib/base-form-component.d.ts.map +1 -1
  3. package/dist/lib/base-form-component.js +384 -541
  4. package/dist/lib/base-form-component.js.map +1 -1
  5. package/dist/lib/container/record-form-container.component.d.ts +165 -0
  6. package/dist/lib/container/record-form-container.component.d.ts.map +1 -0
  7. package/dist/lib/container/record-form-container.component.js +534 -0
  8. package/dist/lib/container/record-form-container.component.js.map +1 -0
  9. package/dist/lib/explorer-entity-data-grid.component.d.ts +7 -5
  10. package/dist/lib/explorer-entity-data-grid.component.d.ts.map +1 -1
  11. package/dist/lib/explorer-entity-data-grid.component.js +15 -9
  12. package/dist/lib/explorer-entity-data-grid.component.js.map +1 -1
  13. package/dist/lib/field/form-field.component.d.ts +268 -0
  14. package/dist/lib/field/form-field.component.d.ts.map +1 -0
  15. package/dist/lib/field/form-field.component.js +1194 -0
  16. package/dist/lib/field/form-field.component.js.map +1 -0
  17. package/dist/lib/form-state.interface.d.ts +2 -0
  18. package/dist/lib/form-state.interface.d.ts.map +1 -1
  19. package/dist/lib/form-state.interface.js.map +1 -1
  20. package/dist/lib/form-state.service.d.ts +14 -0
  21. package/dist/lib/form-state.service.d.ts.map +1 -1
  22. package/dist/lib/form-state.service.js +19 -0
  23. package/dist/lib/form-state.service.js.map +1 -1
  24. package/dist/lib/panel/collapsible-panel.component.d.ts +139 -0
  25. package/dist/lib/panel/collapsible-panel.component.d.ts.map +1 -0
  26. package/dist/lib/panel/collapsible-panel.component.js +468 -0
  27. package/dist/lib/panel/collapsible-panel.component.js.map +1 -0
  28. package/dist/lib/toolbar/form-toolbar.component.d.ts +170 -0
  29. package/dist/lib/toolbar/form-toolbar.component.d.ts.map +1 -0
  30. package/dist/lib/toolbar/form-toolbar.component.js +830 -0
  31. package/dist/lib/toolbar/form-toolbar.component.js.map +1 -0
  32. package/dist/lib/types/form-events.d.ts +90 -0
  33. package/dist/lib/types/form-events.d.ts.map +1 -0
  34. package/dist/lib/types/form-events.js +45 -0
  35. package/dist/lib/types/form-events.js.map +1 -0
  36. package/dist/lib/types/form-types.d.ts +150 -0
  37. package/dist/lib/types/form-types.d.ts.map +1 -0
  38. package/dist/lib/types/form-types.js +12 -0
  39. package/dist/lib/types/form-types.js.map +1 -0
  40. package/dist/lib/types/navigation-events.d.ts +88 -0
  41. package/dist/lib/types/navigation-events.d.ts.map +1 -0
  42. package/dist/lib/types/navigation-events.js +2 -0
  43. package/dist/lib/types/navigation-events.js.map +1 -0
  44. package/dist/lib/types/toolbar-config.d.ts +66 -0
  45. package/dist/lib/types/toolbar-config.d.ts.map +1 -0
  46. package/dist/lib/types/toolbar-config.js +38 -0
  47. package/dist/lib/types/toolbar-config.js.map +1 -0
  48. package/dist/module.d.ts +28 -20
  49. package/dist/module.d.ts.map +1 -1
  50. package/dist/module.js +47 -74
  51. package/dist/module.js.map +1 -1
  52. package/dist/public-api.d.ts +20 -8
  53. package/dist/public-api.d.ts.map +1 -1
  54. package/dist/public-api.js +24 -9
  55. package/dist/public-api.js.map +1 -1
  56. package/package.json +20 -23
  57. package/README.md +0 -449
  58. package/dist/lib/base-field-component.d.ts +0 -152
  59. package/dist/lib/base-field-component.d.ts.map +0 -1
  60. package/dist/lib/base-field-component.js +0 -669
  61. package/dist/lib/base-field-component.js.map +0 -1
  62. package/dist/lib/base-form-context.d.ts +0 -23
  63. package/dist/lib/base-form-context.d.ts.map +0 -1
  64. package/dist/lib/base-form-context.js +0 -10
  65. package/dist/lib/base-form-context.js.map +0 -1
  66. package/dist/lib/collapsible-panel.component.d.ts +0 -68
  67. package/dist/lib/collapsible-panel.component.d.ts.map +0 -1
  68. package/dist/lib/collapsible-panel.component.js +0 -330
  69. package/dist/lib/collapsible-panel.component.js.map +0 -1
  70. package/dist/lib/form-section-controls.component.d.ts +0 -35
  71. package/dist/lib/form-section-controls.component.d.ts.map +0 -1
  72. package/dist/lib/form-section-controls.component.js +0 -273
  73. package/dist/lib/form-section-controls.component.js.map +0 -1
  74. package/dist/lib/link-field.component.d.ts +0 -62
  75. package/dist/lib/link-field.component.d.ts.map +0 -1
  76. package/dist/lib/link-field.component.js +0 -392
  77. package/dist/lib/link-field.component.js.map +0 -1
@@ -1,273 +0,0 @@
1
- import { Component, EventEmitter, Input, Output, ChangeDetectionStrategy } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/forms";
4
- import * as i2 from "@progress/kendo-angular-buttons";
5
- const _c0 = ["toolbar-additional-controls", ""];
6
- function FormSectionControlsComponent_Conditional_6_Template(rf, ctx) { if (rf & 1) {
7
- const _r2 = i0.ɵɵgetCurrentView();
8
- i0.ɵɵelementStart(0, "div", 7);
9
- i0.ɵɵelement(1, "span", 15);
10
- i0.ɵɵelementStart(2, "span", 16);
11
- i0.ɵɵtext(3, "Custom Order");
12
- i0.ɵɵelementEnd();
13
- i0.ɵɵelementStart(4, "button", 17);
14
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_6_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.confirmResetOrder()); });
15
- i0.ɵɵelement(5, "span", 18);
16
- i0.ɵɵelementEnd()();
17
- } }
18
- function FormSectionControlsComponent_Conditional_14_Template(rf, ctx) { if (rf & 1) {
19
- const _r4 = i0.ɵɵgetCurrentView();
20
- i0.ɵɵelementStart(0, "button", 19);
21
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_14_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.clearFilter()); });
22
- i0.ɵɵelement(1, "span", 18);
23
- i0.ɵɵelementEnd();
24
- } }
25
- function FormSectionControlsComponent_Conditional_15_Template(rf, ctx) { if (rf & 1) {
26
- i0.ɵɵelementStart(0, "span", 13);
27
- i0.ɵɵtext(1);
28
- i0.ɵɵelementEnd();
29
- } if (rf & 2) {
30
- const ctx_r2 = i0.ɵɵnextContext();
31
- i0.ɵɵadvance();
32
- i0.ɵɵtextInterpolate2("", ctx_r2.visibleCount, "/", ctx_r2.totalCount);
33
- } }
34
- function FormSectionControlsComponent_Conditional_16_Template(rf, ctx) { if (rf & 1) {
35
- const _r5 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "div", 20);
37
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_16_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelResetOrder()); });
38
- i0.ɵɵelementStart(1, "div", 21);
39
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_16_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r5); return i0.ɵɵresetView($event.stopPropagation()); });
40
- i0.ɵɵelementStart(2, "div", 22);
41
- i0.ɵɵelement(3, "span", 23);
42
- i0.ɵɵelementStart(4, "h3");
43
- i0.ɵɵtext(5, "Reset Section Order");
44
- i0.ɵɵelementEnd()();
45
- i0.ɵɵelementStart(6, "div", 24)(7, "p");
46
- i0.ɵɵtext(8, "Are you sure you want to reset the section order to default?");
47
- i0.ɵɵelementEnd();
48
- i0.ɵɵelementStart(9, "p", 25);
49
- i0.ɵɵtext(10, "This will remove your custom arrangement.");
50
- i0.ɵɵelementEnd()();
51
- i0.ɵɵelementStart(11, "div", 26)(12, "button", 27);
52
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_16_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.doResetOrder()); });
53
- i0.ɵɵelement(13, "span", 28);
54
- i0.ɵɵtext(14, " Reset Order ");
55
- i0.ɵɵelementEnd();
56
- i0.ɵɵelementStart(15, "button", 29);
57
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Conditional_16_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r5); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.cancelResetOrder()); });
58
- i0.ɵɵtext(16, " Cancel ");
59
- i0.ɵɵelementEnd()()()();
60
- } }
61
- /**
62
- * Reusable component for form section controls (Expand All, Collapse All, Filter, Counter, Width Toggle)
63
- * Designed to be projected into form toolbars via ng-content with [toolbar-additional-controls] selector
64
- */
65
- export class FormSectionControlsComponent {
66
- visibleCount = 0;
67
- totalCount = 0;
68
- searchFilter = '';
69
- expandedCount = 0;
70
- showEmptyFields = false;
71
- widthMode = 'centered';
72
- hasCustomOrder = false;
73
- expandAll = new EventEmitter();
74
- collapseAll = new EventEmitter();
75
- filterChange = new EventEmitter();
76
- showEmptyFieldsChange = new EventEmitter();
77
- widthModeChange = new EventEmitter();
78
- resetOrder = new EventEmitter();
79
- searchTerm = '';
80
- showResetConfirmDialog = false;
81
- get allExpanded() {
82
- return this.totalCount > 0 && this.expandedCount === this.totalCount;
83
- }
84
- get allCollapsed() {
85
- return this.totalCount > 0 && this.expandedCount === 0;
86
- }
87
- clearFilter() {
88
- this.searchTerm = '';
89
- this.filterChange.emit('');
90
- }
91
- toggleWidthMode() {
92
- const newMode = this.widthMode === 'centered' ? 'full-width' : 'centered';
93
- this.widthModeChange.emit(newMode);
94
- }
95
- confirmResetOrder() {
96
- this.showResetConfirmDialog = true;
97
- }
98
- doResetOrder() {
99
- this.showResetConfirmDialog = false;
100
- this.resetOrder.emit();
101
- }
102
- cancelResetOrder() {
103
- this.showResetConfirmDialog = false;
104
- }
105
- static ɵfac = function FormSectionControlsComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FormSectionControlsComponent)(); };
106
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FormSectionControlsComponent, selectors: [["mj-form-section-controls", "toolbar-additional-controls", ""]], inputs: { visibleCount: "visibleCount", totalCount: "totalCount", searchFilter: "searchFilter", expandedCount: "expandedCount", showEmptyFields: "showEmptyFields", widthMode: "widthMode", hasCustomOrder: "hasCustomOrder" }, outputs: { expandAll: "expandAll", collapseAll: "collapseAll", filterChange: "filterChange", showEmptyFieldsChange: "showEmptyFieldsChange", widthModeChange: "widthModeChange", resetOrder: "resetOrder" }, standalone: false, attrs: _c0, decls: 17, vars: 11, consts: [["searchInput", ""], ["kendoButton", "", "title", "Expand all sections", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-double-down"], ["kendoButton", "", "title", "Collapse all sections", 3, "click", "disabled"], [1, "fa-solid", "fa-angle-double-up"], ["kendoButton", "", 3, "click", "title"], [1, "fa-solid", "fa-left-right"], ["title", "Sections are in a custom order", 1, "custom-order-indicator"], [1, "show-empty-fields-toggle"], ["type", "checkbox", 3, "ngModelChange", "ngModel"], [2, "position", "relative"], ["type", "text", "placeholder", "Filter sections...", 1, "section-search", 3, "ngModelChange", "ngModel"], ["kendoButton", "", "title", "Clear filter", 1, "clear-search-btn"], [1, "section-count"], [1, "dialog-overlay"], [1, "fa-solid", "fa-shuffle"], [1, "indicator-label"], ["type", "button", "title", "Reset to default order", 1, "reset-order-btn", 3, "click"], [1, "fa-solid", "fa-xmark"], ["kendoButton", "", "title", "Clear filter", 1, "clear-search-btn", 3, "click"], [1, "dialog-overlay", 3, "click"], [1, "confirm-dialog", 3, "click"], [1, "dialog-header"], [1, "fa-solid", "fa-shuffle", "dialog-icon"], [1, "dialog-body"], [1, "dialog-hint"], [1, "dialog-actions"], ["type", "button", 1, "dialog-btn", "dialog-btn-primary", 3, "click"], [1, "fa-solid", "fa-check"], ["type", "button", 1, "dialog-btn", "dialog-btn-secondary", 3, "click"]], template: function FormSectionControlsComponent_Template(rf, ctx) { if (rf & 1) {
107
- const _r1 = i0.ɵɵgetCurrentView();
108
- i0.ɵɵelementStart(0, "button", 1);
109
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.expandAll.emit()); });
110
- i0.ɵɵelement(1, "span", 2);
111
- i0.ɵɵelementEnd();
112
- i0.ɵɵelementStart(2, "button", 3);
113
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.collapseAll.emit()); });
114
- i0.ɵɵelement(3, "span", 4);
115
- i0.ɵɵelementEnd();
116
- i0.ɵɵelementStart(4, "button", 5);
117
- i0.ɵɵlistener("click", function FormSectionControlsComponent_Template_button_click_4_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.toggleWidthMode()); });
118
- i0.ɵɵelement(5, "span", 6);
119
- i0.ɵɵelementEnd();
120
- i0.ɵɵconditionalCreate(6, FormSectionControlsComponent_Conditional_6_Template, 6, 0, "div", 7);
121
- i0.ɵɵelementStart(7, "label", 8)(8, "input", 9);
122
- i0.ɵɵtwoWayListener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.showEmptyFields, $event) || (ctx.showEmptyFields = $event); return i0.ɵɵresetView($event); });
123
- i0.ɵɵlistener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_8_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.showEmptyFieldsChange.emit($event)); });
124
- i0.ɵɵelementEnd();
125
- i0.ɵɵelementStart(9, "span");
126
- i0.ɵɵtext(10, "Show Empty Fields");
127
- i0.ɵɵelementEnd()();
128
- i0.ɵɵelementStart(11, "div", 10)(12, "input", 11, 0);
129
- i0.ɵɵtwoWayListener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.searchTerm, $event) || (ctx.searchTerm = $event); return i0.ɵɵresetView($event); });
130
- i0.ɵɵlistener("ngModelChange", function FormSectionControlsComponent_Template_input_ngModelChange_12_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.filterChange.emit($event)); });
131
- i0.ɵɵelementEnd();
132
- i0.ɵɵconditionalCreate(14, FormSectionControlsComponent_Conditional_14_Template, 2, 0, "button", 12);
133
- i0.ɵɵelementEnd();
134
- i0.ɵɵconditionalCreate(15, FormSectionControlsComponent_Conditional_15_Template, 2, 2, "span", 13);
135
- i0.ɵɵconditionalCreate(16, FormSectionControlsComponent_Conditional_16_Template, 17, 0, "div", 14);
136
- } if (rf & 2) {
137
- i0.ɵɵproperty("disabled", ctx.allExpanded);
138
- i0.ɵɵadvance(2);
139
- i0.ɵɵproperty("disabled", ctx.allCollapsed);
140
- i0.ɵɵadvance(2);
141
- i0.ɵɵclassProp("active", ctx.widthMode === "full-width");
142
- i0.ɵɵproperty("title", ctx.widthMode === "full-width" ? "Switch to centered layout" : "Expand form to full width");
143
- i0.ɵɵadvance(2);
144
- i0.ɵɵconditional(ctx.hasCustomOrder ? 6 : -1);
145
- i0.ɵɵadvance(2);
146
- i0.ɵɵtwoWayProperty("ngModel", ctx.showEmptyFields);
147
- i0.ɵɵadvance(4);
148
- i0.ɵɵtwoWayProperty("ngModel", ctx.searchTerm);
149
- i0.ɵɵadvance(2);
150
- i0.ɵɵconditional(ctx.searchTerm ? 14 : -1);
151
- i0.ɵɵadvance();
152
- i0.ɵɵconditional(ctx.searchFilter && ctx.searchFilter.trim() ? 15 : -1);
153
- i0.ɵɵadvance();
154
- i0.ɵɵconditional(ctx.showResetConfirmDialog ? 16 : -1);
155
- } }, dependencies: [i1.DefaultValueAccessor, i1.CheckboxControlValueAccessor, i1.NgControlStatus, i1.NgModel, i2.ButtonComponent], styles: ["\n\n\n button[_ngcontent-%COMP%] {\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-weight: 500;\n height: 36px;\n box-sizing: border-box;\n }\n\n button[_ngcontent-%COMP%]:hover {\n background: #667eea;\n color: white;\n border-color: #667eea;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);\n }\n\n button[_ngcontent-%COMP%]:active {\n transform: translateY(0);\n }\n\n button.active[_ngcontent-%COMP%] {\n background: #667eea;\n color: white;\n border-color: #667eea;\n }\n\n button[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n margin-right: 0;\n font-size: 14px;\n }\n\n .section-search[_ngcontent-%COMP%] {\n padding: 6px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: white;\n height: 36px;\n box-sizing: border-box;\n }\n\n .section-search[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #667eea;\n box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n }\n\n .section-search[_ngcontent-%COMP%]::placeholder {\n color: #9ca3af;\n font-style: italic;\n }\n\n .section-count[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n font-weight: 500;\n padding: 6px 12px;\n background: #f3f4f6;\n border-radius: 6px;\n }\n\n .clear-search-btn[_ngcontent-%COMP%] {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n padding: 4px 8px;\n min-width: unset;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n user-select: none;\n height: 36px;\n box-sizing: border-box;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] input[type=\"checkbox\"][_ngcontent-%COMP%] {\n cursor: pointer;\n width: 16px;\n height: 16px;\n }\n\n .show-empty-fields-toggle[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n white-space: nowrap;\n }\n\n .custom-order-indicator[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px 6px 14px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);\n height: 36px;\n box-sizing: border-box;\n }\n\n .custom-order-indicator[_ngcontent-%COMP%] .indicator-label[_ngcontent-%COMP%] {\n white-space: nowrap;\n }\n\n .custom-order-indicator[_ngcontent-%COMP%] .reset-order-btn[_ngcontent-%COMP%] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n margin-left: 4px;\n background: rgba(255, 255, 255, 0.2);\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 10px;\n }\n\n .custom-order-indicator[_ngcontent-%COMP%] .reset-order-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.4);\n transform: scale(1.1);\n }\n\n .custom-order-indicator[_ngcontent-%COMP%] .reset-order-btn[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n }\n\n \n\n .dialog-overlay[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease;\n }\n\n @keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes _ngcontent-%COMP%_slideIn {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(-10px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n .confirm-dialog[_ngcontent-%COMP%] {\n background: white;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n width: 380px;\n max-width: 90vw;\n overflow: hidden;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease;\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n }\n\n .dialog-header[_ngcontent-%COMP%] .dialog-icon[_ngcontent-%COMP%] {\n font-size: 20px;\n }\n\n .dialog-header[_ngcontent-%COMP%] h3[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .dialog-body[_ngcontent-%COMP%] {\n padding: 24px;\n }\n\n .dialog-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0 0 8px 0;\n font-size: 15px;\n color: #374151;\n line-height: 1.5;\n }\n\n .dialog-body[_ngcontent-%COMP%] .dialog-hint[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n margin-bottom: 0;\n }\n\n .dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 16px 24px 24px;\n }\n\n .dialog-btn[_ngcontent-%COMP%] {\n flex: 1;\n padding: 10px 16px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .dialog-btn-primary[_ngcontent-%COMP%] {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: none;\n }\n\n .dialog-btn-primary[_ngcontent-%COMP%]:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n }\n\n .dialog-btn-secondary[_ngcontent-%COMP%] {\n background: white;\n color: #374151;\n border: 1px solid #d1d5db;\n }\n\n .dialog-btn-secondary[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }"], changeDetection: 0 });
156
- }
157
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FormSectionControlsComponent, [{
158
- type: Component,
159
- args: [{ standalone: false, selector: 'mj-form-section-controls[toolbar-additional-controls]', changeDetection: ChangeDetectionStrategy.OnPush, template: `
160
- <button kendoButton
161
- (click)="expandAll.emit()"
162
- [disabled]="allExpanded"
163
- title="Expand all sections">
164
- <span class="fa-solid fa-angle-double-down"></span>
165
- </button>
166
- <button kendoButton
167
- (click)="collapseAll.emit()"
168
- [disabled]="allCollapsed"
169
- title="Collapse all sections">
170
- <span class="fa-solid fa-angle-double-up"></span>
171
- </button>
172
- <button kendoButton
173
- (click)="toggleWidthMode()"
174
- [class.active]="widthMode === 'full-width'"
175
- [title]="widthMode === 'full-width' ? 'Switch to centered layout' : 'Expand form to full width'">
176
- <span class="fa-solid fa-left-right"></span>
177
- </button>
178
- @if (hasCustomOrder) {
179
- <div class="custom-order-indicator"
180
- title="Sections are in a custom order">
181
- <span class="fa-solid fa-shuffle"></span>
182
- <span class="indicator-label">Custom Order</span>
183
- <button type="button"
184
- class="reset-order-btn"
185
- (click)="confirmResetOrder()"
186
- title="Reset to default order">
187
- <span class="fa-solid fa-xmark"></span>
188
- </button>
189
- </div>
190
- }
191
- <label class="show-empty-fields-toggle">
192
- <input
193
- type="checkbox"
194
- [(ngModel)]="showEmptyFields"
195
- (ngModelChange)="showEmptyFieldsChange.emit($event)">
196
- <span>Show Empty Fields</span>
197
- </label>
198
- <div style="position: relative;">
199
- <input
200
- type="text"
201
- class="section-search"
202
- placeholder="Filter sections..."
203
- [(ngModel)]="searchTerm"
204
- (ngModelChange)="filterChange.emit($event)"
205
- #searchInput>
206
- @if (searchTerm) {
207
- <button
208
- kendoButton
209
- class="clear-search-btn"
210
- (click)="clearFilter()"
211
- title="Clear filter">
212
- <span class="fa-solid fa-xmark"></span>
213
- </button>
214
- }
215
- </div>
216
- @if (searchFilter && searchFilter.trim()) {
217
- <span class="section-count">{{visibleCount}}/{{totalCount}}</span>
218
- }
219
-
220
- <!-- Custom confirm dialog for reset order -->
221
- @if (showResetConfirmDialog) {
222
- <div class="dialog-overlay" (click)="cancelResetOrder()">
223
- <div class="confirm-dialog" (click)="$event.stopPropagation()">
224
- <div class="dialog-header">
225
- <span class="fa-solid fa-shuffle dialog-icon"></span>
226
- <h3>Reset Section Order</h3>
227
- </div>
228
- <div class="dialog-body">
229
- <p>Are you sure you want to reset the section order to default?</p>
230
- <p class="dialog-hint">This will remove your custom arrangement.</p>
231
- </div>
232
- <div class="dialog-actions">
233
- <button type="button" class="dialog-btn dialog-btn-primary" (click)="doResetOrder()">
234
- <span class="fa-solid fa-check"></span>
235
- Reset Order
236
- </button>
237
- <button type="button" class="dialog-btn dialog-btn-secondary" (click)="cancelResetOrder()">
238
- Cancel
239
- </button>
240
- </div>
241
- </div>
242
- </div>
243
- }
244
- `, styles: ["\n /* Note: positioning (display, gap, align-items, margin-left) is handled by parent toolbar CSS */\n\n button {\n padding: 6px 12px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n background: white;\n color: #374151;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n margin-right: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n font-weight: 500;\n height: 36px;\n box-sizing: border-box;\n }\n\n button:hover {\n background: #667eea;\n color: white;\n border-color: #667eea;\n transform: translateY(-1px);\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.2);\n }\n\n button:active {\n transform: translateY(0);\n }\n\n button.active {\n background: #667eea;\n color: white;\n border-color: #667eea;\n }\n\n button i {\n margin-right: 0;\n font-size: 14px;\n }\n\n .section-search {\n padding: 6px 14px;\n font-size: 13px;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n width: 240px;\n transition: all 0.2s;\n background: white;\n height: 36px;\n box-sizing: border-box;\n }\n\n .section-search:focus {\n outline: none;\n border-color: #667eea;\n box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);\n }\n\n .section-search::placeholder {\n color: #9ca3af;\n font-style: italic;\n }\n\n .section-count {\n font-size: 13px;\n color: #6b7280;\n font-weight: 500;\n padding: 6px 12px;\n background: #f3f4f6;\n border-radius: 6px;\n }\n\n .clear-search-btn {\n position: absolute;\n right: 6px;\n top: 50%;\n transform: translateY(-50%);\n padding: 4px 8px;\n min-width: unset;\n }\n\n .show-empty-fields-toggle {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n padding: 6px 14px;\n background: white;\n border: 1px solid #d1d5db;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.2s;\n font-size: 13px;\n font-weight: 500;\n color: #374151;\n user-select: none;\n height: 36px;\n box-sizing: border-box;\n }\n\n .show-empty-fields-toggle:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n\n .show-empty-fields-toggle input[type=\"checkbox\"] {\n cursor: pointer;\n width: 16px;\n height: 16px;\n }\n\n .show-empty-fields-toggle span {\n white-space: nowrap;\n }\n\n .custom-order-indicator {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: 6px 8px 6px 14px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border-radius: 6px;\n font-size: 13px;\n font-weight: 500;\n box-shadow: 0 2px 4px rgba(102, 126, 234, 0.3);\n height: 36px;\n box-sizing: border-box;\n }\n\n .custom-order-indicator .indicator-label {\n white-space: nowrap;\n }\n\n .custom-order-indicator .reset-order-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n margin-left: 4px;\n background: rgba(255, 255, 255, 0.2);\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n transition: all 0.2s ease;\n font-size: 10px;\n }\n\n .custom-order-indicator .reset-order-btn:hover {\n background: rgba(255, 255, 255, 0.4);\n transform: scale(1.1);\n }\n\n .custom-order-indicator .reset-order-btn:active {\n transform: scale(0.95);\n }\n\n /* Custom confirm dialog styles */\n .dialog-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 10000;\n animation: fadeIn 0.15s ease;\n }\n\n @keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n }\n\n @keyframes slideIn {\n from {\n opacity: 0;\n transform: scale(0.95) translateY(-10px);\n }\n to {\n opacity: 1;\n transform: scale(1) translateY(0);\n }\n }\n\n .confirm-dialog {\n background: white;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n width: 380px;\n max-width: 90vw;\n overflow: hidden;\n animation: slideIn 0.2s ease;\n }\n\n .dialog-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px;\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n }\n\n .dialog-header .dialog-icon {\n font-size: 20px;\n }\n\n .dialog-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n }\n\n .dialog-body {\n padding: 24px;\n }\n\n .dialog-body p {\n margin: 0 0 8px 0;\n font-size: 15px;\n color: #374151;\n line-height: 1.5;\n }\n\n .dialog-body .dialog-hint {\n font-size: 13px;\n color: #6b7280;\n margin-bottom: 0;\n }\n\n .dialog-actions {\n display: flex;\n gap: 12px;\n padding: 16px 24px 24px;\n }\n\n .dialog-btn {\n flex: 1;\n padding: 10px 16px;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n }\n\n .dialog-btn-primary {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n border: none;\n }\n\n .dialog-btn-primary:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);\n }\n\n .dialog-btn-secondary {\n background: white;\n color: #374151;\n border: 1px solid #d1d5db;\n }\n\n .dialog-btn-secondary:hover {\n background: #f3f4f6;\n border-color: #9ca3af;\n }\n "] }]
245
- }], null, { visibleCount: [{
246
- type: Input
247
- }], totalCount: [{
248
- type: Input
249
- }], searchFilter: [{
250
- type: Input
251
- }], expandedCount: [{
252
- type: Input
253
- }], showEmptyFields: [{
254
- type: Input
255
- }], widthMode: [{
256
- type: Input
257
- }], hasCustomOrder: [{
258
- type: Input
259
- }], expandAll: [{
260
- type: Output
261
- }], collapseAll: [{
262
- type: Output
263
- }], filterChange: [{
264
- type: Output
265
- }], showEmptyFieldsChange: [{
266
- type: Output
267
- }], widthModeChange: [{
268
- type: Output
269
- }], resetOrder: [{
270
- type: Output
271
- }] }); })();
272
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FormSectionControlsComponent, { className: "FormSectionControlsComponent", filePath: "src/lib/form-section-controls.component.ts", lineNumber: 384 }); })();
273
- //# sourceMappingURL=form-section-controls.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"form-section-controls.component.js","sourceRoot":"","sources":["../../src/lib/form-section-controls.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;;;;;;;IAiCpF,8BAC4C;IACxC,2BAAyC;IACzC,gCAA8B;IAAA,4BAAY;IAAA,iBAAO;IACjD,kCAGuC;IAD/B,gMAAS,0BAAmB,KAAC;IAEjC,2BAAuC;IAE/C,AADI,iBAAS,EACP;;;;IAkBF,kCAIyB;IADrB,iMAAS,oBAAa,KAAC;IAEvB,2BAAuC;IAC3C,iBAAS;;;IAIb,gCAA4B;IAAA,YAA+B;IAAA,iBAAO;;;IAAtC,cAA+B;IAA/B,sEAA+B;;;;IAK3D,+BAAyD;IAA7B,8LAAS,yBAAkB,KAAC;IACpD,+BAA+D;IAAnC,iKAAS,wBAAwB,KAAC;IAC1D,+BAA2B;IACvB,2BAAqD;IACrD,0BAAI;IAAA,mCAAmB;IAC3B,AAD2B,iBAAK,EAC1B;IAEF,AADJ,+BAAyB,QAClB;IAAA,4EAA4D;IAAA,iBAAI;IACnE,6BAAuB;IAAA,0DAAyC;IACpE,AADoE,iBAAI,EAClE;IAEF,AADJ,gCAA4B,kBAC6D;IAAzB,kMAAS,qBAAc,KAAC;IAChF,4BAAuC;IACvC,8BACJ;IAAA,iBAAS;IACT,mCAA2F;IAA7B,kMAAS,yBAAkB,KAAC;IACtF,yBACJ;IAGZ,AADI,AADI,AADI,iBAAS,EACP,EACJ,EACJ;;AA3FlB;;;GAGG;AAuXH,MAAM,OAAO,4BAA4B;IAC5B,YAAY,GAAW,CAAC,CAAC;IACzB,UAAU,GAAW,CAAC,CAAC;IACvB,YAAY,GAAW,EAAE,CAAC;IAC1B,aAAa,GAAW,CAAC,CAAC;IAC1B,eAAe,GAAY,KAAK,CAAC;IACjC,SAAS,GAAkB,UAAU,CAAC;IACtC,cAAc,GAAY,KAAK,CAAC;IAC/B,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IACrC,WAAW,GAAG,IAAI,YAAY,EAAQ,CAAC;IACvC,YAAY,GAAG,IAAI,YAAY,EAAU,CAAC;IAC1C,qBAAqB,GAAG,IAAI,YAAY,EAAW,CAAC;IACpD,eAAe,GAAG,IAAI,YAAY,EAAiB,CAAC;IACpD,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEhD,UAAU,GAAG,EAAE,CAAC;IAChB,sBAAsB,GAAG,KAAK,CAAC;IAE/B,IAAI,WAAW;QACX,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,UAAU,CAAC;IACzE,CAAC;IAED,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,CAAC;IAC3D,CAAC;IAED,WAAW;QACP,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,eAAe;QACX,MAAM,OAAO,GAAkB,IAAI,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC;QACzF,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,iBAAiB;QACb,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;IACvC,CAAC;IAED,YAAY;QACR,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,gBAAgB;QACZ,IAAI,CAAC,sBAAsB,GAAG,KAAK,CAAC;IACxC,CAAC;sHA/CQ,4BAA4B;6DAA5B,4BAA4B;;YAjXjC,iCAGoC;YAF5B,+IAAS,oBAAgB,KAAC;YAG9B,0BAAmD;YACvD,iBAAS;YACT,iCAGsC;YAF9B,+IAAS,sBAAkB,KAAC;YAGhC,0BAAiD;YACrD,iBAAS;YACT,iCAGyG;YAFjG,+IAAS,qBAAiB,KAAC;YAG/B,0BAA4C;YAChD,iBAAS;YACT,8FAAsB;YAclB,AADJ,gCAAwC,eAIqB;YADrD,2QAA6B;YAC7B,oKAAiB,sCAAkC,KAAC;YAHxD,iBAGyD;YACzD,4BAAM;YAAA,kCAAiB;YAC3B,AAD2B,iBAAO,EAC1B;YAEJ,AADJ,gCAAiC,oBAOZ;YAFb,kQAAwB;YACxB,qKAAiB,6BAAyB,KAAC;YAL/C,iBAMiB;YACjB,oGAAkB;YAStB,iBAAM;YACN,kGAA2C;YAK3C,kGAA8B;;YA3DtB,0CAAwB;YAMxB,eAAyB;YAAzB,2CAAyB;YAMzB,eAA2C;YAA3C,wDAA2C;YAC3C,kHAAgG;YAGxG,eAYC;YAZD,6CAYC;YAIO,eAA6B;YAA7B,mDAA6B;YAS7B,eAAwB;YAAxB,8CAAwB;YAG5B,eAQC;YARD,0CAQC;YAEL,cAEC;YAFD,uEAEC;YAGD,cAsBC;YAtBD,sDAsBC;;;iFA8RI,4BAA4B;cAtXxC,SAAS;6BACI,KAAK,YACL,uDAAuD,mBAChD,uBAAuB,CAAC,MAAM,YACrC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAqFT;;kBA8RA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAbE,4BAA4B"}
@@ -1,62 +0,0 @@
1
- import { AfterViewInit, ElementRef, ChangeDetectorRef } from "@angular/core";
2
- import { BaseRecordComponent } from "./base-record-component";
3
- import { BaseEntity, EntityFieldInfo, EntityInfo } from "@memberjunction/core";
4
- import { NavigationService } from "@memberjunction/ng-shared";
5
- import * as i0 from "@angular/core";
6
- /**
7
- * This component is used to automatically generate a UI for any field in a given BaseEntity object. The CodeGen tool will generate forms and form sections that
8
- * use this component. This component automatically determines the type of the field and generates the appropriate UI element for it. It is possible to use other
9
- * elements to render a field as desired in a custom form, think of this component as a nice "base" component you can use for many cases, and you can create custom
10
- * components for field rendering/editing when needed.
11
- */
12
- export declare class MJLinkField extends BaseRecordComponent implements AfterViewInit {
13
- private cdr;
14
- private navigationService;
15
- constructor(cdr: ChangeDetectorRef, navigationService: NavigationService);
16
- /**
17
- * The record object that contains the field to be rendered. This object should be an instance of BaseEntity or a derived class.
18
- */
19
- record: BaseEntity;
20
- /**
21
- * The name of the field in the entity to be rendered.
22
- */
23
- FieldName: string;
24
- /**
25
- * For users of this component, if you already know the name of the record we are linking to, provide it here to reduce DB overhead
26
- */
27
- RecordName?: string;
28
- /**
29
- * The type of component to show, search is a user input field that searches for records, dropdown is a dropdown list of records. The default is 'search'. If the related entity has
30
- * a small list of possible records, it is often desirable to show a dropdown list instead of a search box.
31
- */
32
- LinkComponentType?: 'Search' | 'Dropdown';
33
- RelatedEntityInfo: EntityInfo | undefined;
34
- private _SelectedRecord;
35
- get SelectedRecord(): BaseEntity | undefined;
36
- set SelectedRecord(val: BaseEntity | undefined);
37
- RecordLinked: boolean;
38
- RelatedEntityRecords: BaseEntity[];
39
- showMatchingRecords: boolean;
40
- dropDownColumns: EntityFieldInfo[];
41
- inputBox: ElementRef;
42
- private initComponent;
43
- ngAfterViewInit(): Promise<void>;
44
- private _cache_userCanCreateNewLinkedRecord;
45
- get UserCanCreateNewLinkedRecord(): boolean;
46
- onNewClicked(): void;
47
- protected AttemptToLinkValue(): Promise<void>;
48
- get Value(): any;
49
- set Value(val: any);
50
- get EntityField(): EntityFieldInfo | undefined;
51
- get DisplayName(): string;
52
- onClearClicked(): void;
53
- RelatedEntityNameField: string;
54
- protected fetchMatchingRecords(query: string): Promise<void>;
55
- GetRecordDisplayString(record: any): any;
56
- protected populateDropdownList(): Promise<void>;
57
- protected SetDropdownValue(): Promise<void>;
58
- onRecordSelected(linkedRecord: BaseEntity): void;
59
- static ɵfac: i0.ɵɵFactoryDeclaration<MJLinkField, never>;
60
- static ɵcmp: i0.ɵɵComponentDeclaration<MJLinkField, "mj-link-field", never, { "record": { "alias": "record"; "required": false; }; "FieldName": { "alias": "FieldName"; "required": false; }; "RecordName": { "alias": "RecordName"; "required": false; }; "LinkComponentType": { "alias": "LinkComponentType"; "required": false; }; }, {}, never, never, false, never>;
61
- }
62
- //# sourceMappingURL=link-field.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link-field.component.d.ts","sourceRoot":"","sources":["../../src/lib/link-field.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAa,UAAU,EAAoB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1G,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAgB,eAAe,EAAE,UAAU,EAAqB,MAAM,sBAAsB,CAAC;AAEhH,OAAO,EAAiB,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;;AAE7E;;;;;GAKG;AACH,qBAMa,WAAY,SAAQ,mBAAoB,YAAW,aAAa;IAC7D,OAAO,CAAC,GAAG;IAAqB,OAAO,CAAC,iBAAiB;gBAAjD,GAAG,EAAE,iBAAiB,EAAU,iBAAiB,EAAE,iBAAiB;IAGxF;;OAEG;IACM,MAAM,EAAG,UAAU,CAAC;IAE7B;;OAEG;IACM,SAAS,EAAE,MAAM,CAAM;IAEhC;;OAEG;IACM,UAAU,CAAC,EAAE,MAAM,CAAM;IAElC;;;OAGG;IACM,iBAAiB,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAY;IAEvD,iBAAiB,EAAE,UAAU,GAAG,SAAS,CAAa;IAE7D,OAAO,CAAC,eAAe,CAAqC;IAC5D,IAAW,cAAc,IAAI,UAAU,GAAG,SAAS,CAElD;IACD,IAAW,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,EAOpD;IACM,YAAY,EAAE,OAAO,CAAS;IAC9B,oBAAoB,EAAE,UAAU,EAAE,CAAM;IACxC,mBAAmB,EAAE,OAAO,CAAS;IACrC,eAAe,EAAE,eAAe,EAAE,CAAM;IAEL,QAAQ,EAAG,UAAU,CAAC;YAElD,aAAa;IA0CrB,eAAe;IAIrB,OAAO,CAAC,mCAAmC,CAAwB;IACnE,IAAW,4BAA4B,IAAI,OAAO,CAcjD;IAEM,YAAY;cAcH,kBAAkB;IAoBlC,IAAW,KAAK,IAAI,GAAG,CAEtB;IAED,IAAW,KAAK,CAAC,GAAG,EAAE,GAAG,EAQxB;IAED,IAAW,WAAW,IAAI,eAAe,GAAG,SAAS,CAEpD;IACD,IAAW,WAAW,IAAI,MAAM,CAM/B;IAGM,cAAc;IAOd,sBAAsB,EAAE,MAAM,CAAM;cAC3B,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAuD3C,sBAAsB,CAAC,MAAM,EAAE,GAAG;cAazB,oBAAoB;cA4BpB,gBAAgB;IAIzB,gBAAgB,CAAC,YAAY,EAAE,UAAU;yCArRvC,WAAW;2CAAX,WAAW;CAsSvB"}