@masterteam/structure-builder 0.0.29 → 0.0.31

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.
package/README.md CHANGED
@@ -1,10 +1,10 @@
1
- # @masterteam/structure-builder
2
-
3
-
4
- ## 🤝 Contributing
5
-
6
- Contributions are welcome\! Please feel free to open an issue or submit a pull request.
7
-
8
- ## 📄 License
9
-
10
- This project is licensed under the MIT License.
1
+ # @masterteam/structure-builder
2
+
3
+
4
+ ## 🤝 Contributing
5
+
6
+ Contributions are welcome\! Please feel free to open an issue or submit a pull request.
7
+
8
+ ## 📄 License
9
+
10
+ This project is licensed under the MIT License.
@@ -1,13 +1,13 @@
1
- {
2
- "structureBuilder": {
3
- "levelTemplates": "قوالب المستويات",
4
- "steps": "الخطوات",
5
- "dragToAdd": "اسحب لإضافة عنصر إلى الهيكل الخاص بك:",
6
- "allItemsInUse": "جميع عناصر {tab} قيد الاستخدام",
7
- "addNode": "إضافة عقدة",
8
- "editNodeProperties": "تعديل خصائص العقدة",
9
- "editConnectionProperties": "تعديل خصائص الاتصال",
10
- "cancel": "إلغاء",
11
- "saveChanges": "حفظ التغييرات"
12
- }
13
- }
1
+ {
2
+ "structureBuilder": {
3
+ "levelTemplates": "قوالب المستويات",
4
+ "steps": "الخطوات",
5
+ "dragToAdd": "اسحب لإضافة عنصر إلى الهيكل الخاص بك:",
6
+ "allItemsInUse": "جميع عناصر {tab} قيد الاستخدام",
7
+ "addNode": "إضافة عقدة",
8
+ "editNodeProperties": "تعديل خصائص العقدة",
9
+ "editConnectionProperties": "تعديل خصائص الاتصال",
10
+ "cancel": "إلغاء",
11
+ "saveChanges": "حفظ التغييرات"
12
+ }
13
+ }
@@ -1,13 +1,13 @@
1
- {
2
- "structureBuilder": {
3
- "levelTemplates": "Level templates",
4
- "steps": "Steps",
5
- "dragToAdd": "Drag to add item to your Structure:",
6
- "allItemsInUse": "All {tab} items are in use",
7
- "addNode": "Add Node",
8
- "editNodeProperties": "Edit Node Properties",
9
- "editConnectionProperties": "Edit Connection Properties",
10
- "cancel": "Cancel",
11
- "saveChanges": "Save Changes"
12
- }
13
- }
1
+ {
2
+ "structureBuilder": {
3
+ "levelTemplates": "Level templates",
4
+ "steps": "Steps",
5
+ "dragToAdd": "Drag to add item to your Structure:",
6
+ "allItemsInUse": "All {tab} items are in use",
7
+ "addNode": "Add Node",
8
+ "editNodeProperties": "Edit Node Properties",
9
+ "editConnectionProperties": "Edit Connection Properties",
10
+ "cancel": "Cancel",
11
+ "saveChanges": "Save Changes"
12
+ }
13
+ }
package/assets/sb.css CHANGED
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
1
+ /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
2
2
  @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-gray-400:oklch(70.7% .022 261.325);--color-white:#fff;--spacing:.25rem;--container-3xs:16rem;--container-xs:20rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--font-weight-medium:500;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--radius-2xl:1rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.start-4{inset-inline-start:calc(var(--spacing)*4)}.top-4{top:calc(var(--spacing)*4)}.z-0{z-index:0}.z-1{z-index:1}.ms-4{margin-inline-start:calc(var(--spacing)*4)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.flex{display:flex}.size-full{width:100%;height:100%}.h-\[calc\(100\%---spacing\(8\)\)\]{height:calc(100% - calc(var(--spacing)*8))}.h-full{height:100%}.\!w-\[35rem\]{width:35rem!important}.w-1\/5{width:20%}.w-64{width:calc(var(--spacing)*64)}.min-w-3xs{min-width:var(--container-3xs)}.min-w-xs{min-width:var(--container-xs)}.flex-1{flex:1}.cursor-move{cursor:move}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded-\(--p-button-border-radius\){border-radius:var(--p-button-border-radius)}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.border-1{border-style:var(--tw-border-style);border-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\(--p-content-border-color\){border-color:var(--p-content-border-color)}.border-surface-300{border-color:var(--p-surface-300)}@supports (color:color-mix(in lab, red, red)){.border-surface-300{border-color:color-mix(in srgb,var(--p-surface-300)calc(100%*1),transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb,var(--p-surface-50)calc(100%*1),transparent)}}.bg-surface-200{background-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.bg-surface-200{background-color:color-mix(in srgb,var(--p-surface-200)calc(100%*1),transparent)}}.bg-transparent\!{background-color:#0000!important}.bg-white{background-color:var(--color-white)}.p-0\!{padding:calc(var(--spacing)*0)!important}.p-1{padding:calc(var(--spacing)*1)}.p-4{padding:calc(var(--spacing)*4)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-5{padding-top:calc(var(--spacing)*5)}.text-center{text-align:center}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-gray-400{color:var(--color-gray-400)}.text-primary{color:var(--p-primary-color)}@supports (color:color-mix(in lab, red, red)){.text-primary{color:color-mix(in srgb,var(--p-primary-color)calc(100%*1),transparent)}}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.hover\:border-solid:hover{--tw-border-style:solid;border-style:solid}.hover\:bg-emphasis:hover{background:var(--p-content-hover-background);color:var(--p-content-hover-color)}}.dark\:border-surface-500:where(.dark,.dark *){border-color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.dark\:border-surface-500:where(.dark,.dark *){border-color:color-mix(in srgb,var(--p-surface-500)calc(100%*1),transparent)}}.dark\:bg-surface-700:where(.dark,.dark *){background-color:var(--p-surface-700)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-700:where(.dark,.dark *){background-color:color-mix(in srgb,var(--p-surface-700)calc(100%*1),transparent)}}.dark\:bg-surface-800:where(.dark,.dark *){background-color:var(--p-surface-800)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-800:where(.dark,.dark *){background-color:color-mix(in srgb,var(--p-surface-800)calc(100%*1),transparent)}}.dark\:bg-surface-900:where(.dark,.dark *){background-color:var(--p-surface-900)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-surface-900:where(.dark,.dark *){background-color:color-mix(in srgb,var(--p-surface-900)calc(100%*1),transparent)}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0),var(--p-enter-translate-y,0),0)scale3d(var(--p-enter-scale,1),var(--p-enter-scale,1),var(--p-enter-scale,1))rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0),var(--p-leave-translate-y,0),0)scale3d(var(--p-leave-scale,1),var(--p-leave-scale,1),var(--p-leave-scale,1))rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -7,7 +7,7 @@ import { CommonModule } from '@angular/common';
7
7
  import * as i2 from '@angular/forms';
8
8
  import { FormControl, ReactiveFormsModule, FormsModule } from '@angular/forms';
9
9
  import { ModalRef, DialogService } from '@masterteam/components/dialog';
10
- import { DrawerService } from '@masterteam/components/dynamic-drawer';
10
+ import { DrawerController, DrawerService } from '@masterteam/components/dynamic-drawer';
11
11
  import { ModalService } from '@masterteam/components/modal';
12
12
  import * as i3$1 from 'primeng/tabs';
13
13
  import { TabsModule } from 'primeng/tabs';
@@ -25,6 +25,8 @@ import { Skeleton } from 'primeng/skeleton';
25
25
  class NodeFormDialogComponent {
26
26
  modalService = inject(ModalService);
27
27
  ref = inject(ModalRef);
28
+ // DrawerController is optional - only available when opened as drawer
29
+ drawerController = inject(DrawerController, { optional: true });
28
30
  dynamicFormControl = new FormControl();
29
31
  nodeData;
30
32
  formSchema;
@@ -42,6 +44,7 @@ class NodeFormDialogComponent {
42
44
  save: (item = {}) => this.onSave(item),
43
45
  cancel: () => this.onCancel(),
44
46
  close: () => this.onCancel(),
47
+ drawerController: this.drawerController,
45
48
  };
46
49
  }
47
50
  onSave(item = {}) {
@@ -56,7 +59,7 @@ class NodeFormDialogComponent {
56
59
  this.ref.close();
57
60
  }
58
61
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NodeFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
59
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NodeFormDialogComponent, isStandalone: true, selector: "mt-node-form-dialog", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (this.data()?.template) {\n <ng-container\n *ngTemplateOutlet=\"data().template; context: templateContext\"\n ></ng-container>\n } @else {\n @if (nodeData) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n }\n</div>\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
62
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: NodeFormDialogComponent, isStandalone: true, selector: "mt-node-form-dialog", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (this.data()?.template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"data().template; context: templateContext\"\r\n ></ng-container>\r\n } @else {\r\n @if (nodeData) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
60
63
  }
61
64
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NodeFormDialogComponent, decorators: [{
62
65
  type: Component,
@@ -66,7 +69,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
66
69
  Button,
67
70
  ReactiveFormsModule,
68
71
  TranslocoModule,
69
- ], template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (this.data()?.template) {\n <ng-container\n *ngTemplateOutlet=\"data().template; context: templateContext\"\n ></ng-container>\n } @else {\n @if (nodeData) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n }\n</div>\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n" }]
72
+ ], template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (this.data()?.template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"data().template; context: templateContext\"\r\n ></ng-container>\r\n } @else {\r\n @if (nodeData) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n" }]
70
73
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
71
74
 
72
75
  class ConnectionFormDialogComponent {
@@ -95,7 +98,7 @@ class ConnectionFormDialogComponent {
95
98
  this.ref.close();
96
99
  }
97
100
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ConnectionFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
98
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: ConnectionFormDialogComponent, isStandalone: true, selector: "mt-connection-form-dialog", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (connectionData && formSchema?.sections.length > 0) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n</div>\n\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: ConnectionFormDialogComponent, isStandalone: true, selector: "mt-connection-form-dialog", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (connectionData && formSchema?.sections.length > 0) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DynamicForm, selector: "mt-dynamic-form", inputs: ["formConfig"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
99
102
  }
100
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ConnectionFormDialogComponent, decorators: [{
101
104
  type: Component,
@@ -105,7 +108,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
105
108
  Button,
106
109
  ReactiveFormsModule,
107
110
  TranslocoModule,
108
- ], template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (connectionData && formSchema?.sections.length > 0) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n</div>\n\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n" }]
111
+ ], template: "<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (connectionData && formSchema?.sections.length > 0) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n" }]
109
112
  }], propDecorators: { data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }] } });
110
113
 
111
114
  class Toolbar {
@@ -129,11 +132,11 @@ class Toolbar {
129
132
  this.builderComponent.maybeAutoLayout();
130
133
  }
131
134
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Toolbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
132
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.3", type: Toolbar, isStandalone: true, selector: "mt-toolbar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mt-button\n (onClick)=\"autoLayout()\"\n class=\"bg-content rounded-(--p-button-border-radius)\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"arrow.refresh-cw-05\"\n></mt-button>\n\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\n <mt-button\n (onClick)=\"onZoomOut()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.minus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onZoomIn()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.plus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onFitToScreen()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"layout.grid-02\"\n ></mt-button>\n</mt-buttongroup>\n", styles: [":host{display:flex;justify-content:flex-end;align-items:center;position:absolute;gap:calc(var(--spacing) * 2);inset-inline-end:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}\n"], dependencies: [{ kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ButtonGroup, selector: "mt-buttonGroup, mt-buttongroup, mt-button-group" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.3", type: Toolbar, isStandalone: true, selector: "mt-toolbar", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<mt-button\r\n (onClick)=\"autoLayout()\"\r\n class=\"bg-content rounded-(--p-button-border-radius)\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"arrow.refresh-cw-05\"\r\n></mt-button>\r\n\r\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\r\n <mt-button\r\n (onClick)=\"onZoomOut()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.minus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onZoomIn()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.plus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onFitToScreen()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"layout.grid-02\"\r\n ></mt-button>\r\n</mt-buttongroup>\r\n", styles: [":host{display:flex;justify-content:flex-end;align-items:center;position:absolute;gap:calc(var(--spacing) * 2);inset-inline-end:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}\n"], dependencies: [{ kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ButtonGroup, selector: "mt-buttonGroup, mt-buttongroup, mt-button-group" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
133
136
  }
134
137
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: Toolbar, decorators: [{
135
138
  type: Component,
136
- args: [{ selector: 'mt-toolbar', imports: [Button, ButtonGroup], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mt-button\n (onClick)=\"autoLayout()\"\n class=\"bg-content rounded-(--p-button-border-radius)\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"arrow.refresh-cw-05\"\n></mt-button>\n\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\n <mt-button\n (onClick)=\"onZoomOut()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.minus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onZoomIn()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.plus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onFitToScreen()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"layout.grid-02\"\n ></mt-button>\n</mt-buttongroup>\n", styles: [":host{display:flex;justify-content:flex-end;align-items:center;position:absolute;gap:calc(var(--spacing) * 2);inset-inline-end:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}\n"] }]
139
+ args: [{ selector: 'mt-toolbar', imports: [Button, ButtonGroup], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mt-button\r\n (onClick)=\"autoLayout()\"\r\n class=\"bg-content rounded-(--p-button-border-radius)\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"arrow.refresh-cw-05\"\r\n></mt-button>\r\n\r\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\r\n <mt-button\r\n (onClick)=\"onZoomOut()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.minus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onZoomIn()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.plus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onFitToScreen()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"layout.grid-02\"\r\n ></mt-button>\r\n</mt-buttongroup>\r\n", styles: [":host{display:flex;justify-content:flex-end;align-items:center;position:absolute;gap:calc(var(--spacing) * 2);inset-inline-end:calc(var(--spacing) * 4);bottom:calc(var(--spacing) * 4)}\n"] }]
137
140
  }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }] } });
138
141
 
139
142
  class FilterActionsPipe {
@@ -349,6 +352,8 @@ class StructureBuilder {
349
352
  focusOnShow: this.nodeDialogTemplate() ? false : true,
350
353
  appendTo: this.appendTo(),
351
354
  position: modalType === 'drawer' ? 'end' : undefined,
355
+ dismissible: true,
356
+ modal: true,
352
357
  inputValues: {
353
358
  data: {
354
359
  node: node,
@@ -475,7 +480,7 @@ class StructureBuilder {
475
480
  return (connectionEndId || '').replace(/-(in|out)$/, '');
476
481
  }
477
482
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: StructureBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
478
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: StructureBuilder, isStandalone: true, selector: "mt-structure-builder", inputs: { availableNodes: { classPropertyName: "availableNodes", publicName: "availableNodes", isSignal: true, isRequired: false, transformFunction: null }, nodeForm: { classPropertyName: "nodeForm", publicName: "nodeForm", isSignal: true, isRequired: false, transformFunction: null }, connectionForm: { classPropertyName: "connectionForm", publicName: "connectionForm", isSignal: true, isRequired: false, transformFunction: null }, nodeActions: { classPropertyName: "nodeActions", publicName: "nodeActions", isSignal: true, isRequired: false, transformFunction: null }, nodeFields: { classPropertyName: "nodeFields", publicName: "nodeFields", isSignal: true, isRequired: false, transformFunction: null }, isAutoLayout: { classPropertyName: "isAutoLayout", publicName: "isAutoLayout", isSignal: true, isRequired: false, transformFunction: null }, addModalType: { classPropertyName: "addModalType", publicName: "addModalType", isSignal: true, isRequired: false, transformFunction: null }, updateModalType: { classPropertyName: "updateModalType", publicName: "updateModalType", isSignal: true, isRequired: false, transformFunction: null }, addModalStyleClass: { classPropertyName: "addModalStyleClass", publicName: "addModalStyleClass", isSignal: true, isRequired: false, transformFunction: null }, updateModalStyleClass: { classPropertyName: "updateModalStyleClass", publicName: "updateModalStyleClass", isSignal: true, isRequired: false, transformFunction: null }, addModalHeader: { classPropertyName: "addModalHeader", publicName: "addModalHeader", isSignal: true, isRequired: false, transformFunction: null }, updateModalHeader: { classPropertyName: "updateModalHeader", publicName: "updateModalHeader", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, connections: { classPropertyName: "connections", publicName: "connections", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeActionsEvent: "nodeActionsEvent", action: "action", nodes: "nodesChange", connections: "connectionsChange" }, host: { classAttribute: "flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden" }, providers: [DialogService], queries: [{ propertyName: "nodeDialogTemplate", first: true, predicate: ["nodeDialog"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "fCanvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fFlowComponent", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }, { propertyName: "fCanvasComponent", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fZoomDirective", first: true, predicate: FZoomDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- structure-builder.html -->\n@if (availableTabs().length > 0) {\n <mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n >\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">\n {{ \"structureBuilder.levelTemplates\" | transloco }}\n </h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs\n [(value)]=\"activeTab\"\n styleClass=\"structure-tabs \"\n class=\"h-full overflow-hidden\"\n >\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n {{ \"structureBuilder.dragToAdd\" | transloco }}\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.label\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">\n {{\n \"structureBuilder.allItemsInUse\"\n | transloco: { tab: tab }\n }}\n </p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n </mt-card>\n} @else if (availableNodes().length > 0) {\n <mt-card\n [title]=\"'structureBuilder.steps' | transloco\"\n class=\"absolute top-4 start-4 z-1 w-64\"\n >\n <div class=\"flex flex-col gap-2\">\n @for (node of availableNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\n </div>\n }\n </div>\n </mt-card>\n}\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <ng-content select=\"[flowContent]\"></ng-content>\n\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (\n action of nodeActions() | filterActions: node;\n track action.key\n ) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep :root{--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i2$1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId"], outputs: ["fLoaded"] }, { kind: "component", type: i2$1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime"], outputs: ["fCanvasChange"] }, { kind: "component", type: i2$1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i2$1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i2$1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fZoomDblClickStep"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FExternalItemDirective, selector: "[fExternalItem]", inputs: ["fExternalItemId", "fData", "fDisabled", "fPreview", "fPreviewMatchSize", "fPlaceholder"] }, { kind: "component", type: i2$1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fText", "fTextStartOffset", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fSelectionDisabled", "fReassignableStart", "fReassignDisabled", "fInputSide", "fOutputSide"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FConnectionCenterDirective, selector: "[fConnectionCenter]", inputs: ["fConnectionCenter"] }, { kind: "component", type: i2$1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i2$1.FMarkerDirective, selector: "svg[fMarker]", inputs: ["width", "height", "refX", "refY", "type", "orient", "markerUnits"] }, { kind: "component", type: i2$1.FSnapConnectionComponent, selector: "f-snap-connection", inputs: ["fSnapThreshold", "fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i2$1.FNodeInputDirective, selector: "[fNodeInput]", inputs: ["fInputId", "fInputCategory", "fInputMultiple", "fInputDisabled", "fInputConnectableSide"], exportAs: ["fNodeInput"] }, { kind: "directive", type: i2$1.FNodeOutputDirective, selector: "[fNodeOutput]", inputs: ["fOutputId", "fOutputMultiple", "fOutputDisabled", "fOutputConnectableSide", "isSelfConnectable", "fCanBeConnectedInputs"], exportAs: ["fNodeOutput"] }, { kind: "directive", type: i2$1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fConnectOnNode", "fMinimapClass", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fAutoExpandOnChildHit", "fAutoSizeToFitChildren"], outputs: ["fNodePositionChange", "fNodeSizeChange", "fNodeRotateChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i2$1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fNodeIntersectedWithConnections", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i3$1.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i3$1.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i3$1.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i3$1.TabList, selector: "p-tablist" }, { kind: "component", type: i3$1.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Toolbar, selector: "mt-toolbar", inputs: ["size"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: FilterActionsPipe, name: "filterActions" }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
483
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: StructureBuilder, isStandalone: true, selector: "mt-structure-builder", inputs: { availableNodes: { classPropertyName: "availableNodes", publicName: "availableNodes", isSignal: true, isRequired: false, transformFunction: null }, nodeForm: { classPropertyName: "nodeForm", publicName: "nodeForm", isSignal: true, isRequired: false, transformFunction: null }, connectionForm: { classPropertyName: "connectionForm", publicName: "connectionForm", isSignal: true, isRequired: false, transformFunction: null }, nodeActions: { classPropertyName: "nodeActions", publicName: "nodeActions", isSignal: true, isRequired: false, transformFunction: null }, nodeFields: { classPropertyName: "nodeFields", publicName: "nodeFields", isSignal: true, isRequired: false, transformFunction: null }, isAutoLayout: { classPropertyName: "isAutoLayout", publicName: "isAutoLayout", isSignal: true, isRequired: false, transformFunction: null }, addModalType: { classPropertyName: "addModalType", publicName: "addModalType", isSignal: true, isRequired: false, transformFunction: null }, updateModalType: { classPropertyName: "updateModalType", publicName: "updateModalType", isSignal: true, isRequired: false, transformFunction: null }, addModalStyleClass: { classPropertyName: "addModalStyleClass", publicName: "addModalStyleClass", isSignal: true, isRequired: false, transformFunction: null }, updateModalStyleClass: { classPropertyName: "updateModalStyleClass", publicName: "updateModalStyleClass", isSignal: true, isRequired: false, transformFunction: null }, addModalHeader: { classPropertyName: "addModalHeader", publicName: "addModalHeader", isSignal: true, isRequired: false, transformFunction: null }, updateModalHeader: { classPropertyName: "updateModalHeader", publicName: "updateModalHeader", isSignal: true, isRequired: false, transformFunction: null }, appendTo: { classPropertyName: "appendTo", publicName: "appendTo", isSignal: true, isRequired: false, transformFunction: null }, nodes: { classPropertyName: "nodes", publicName: "nodes", isSignal: true, isRequired: false, transformFunction: null }, connections: { classPropertyName: "connections", publicName: "connections", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeActionsEvent: "nodeActionsEvent", action: "action", nodes: "nodesChange", connections: "connectionsChange" }, host: { classAttribute: "flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden" }, providers: [DialogService], queries: [{ propertyName: "nodeDialogTemplate", first: true, predicate: ["nodeDialog"], descendants: true, isSignal: true }], viewQueries: [{ propertyName: "fCanvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fFlowComponent", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }, { propertyName: "fCanvasComponent", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "fZoomDirective", first: true, predicate: FZoomDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- structure-builder.html -->\r\n@if (availableTabs().length > 0) {\r\n <mt-card\r\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\r\n >\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <div class=\"flex items-center justify-between px-4 pt-5\">\r\n <h3 class=\"text-xl font-semibold\">\r\n {{ \"structureBuilder.levelTemplates\" | transloco }}\r\n </h3>\r\n </div>\r\n\r\n <!-- Tabs using PrimeNG -->\r\n <p-tabs\r\n [(value)]=\"activeTab\"\r\n styleClass=\"structure-tabs \"\r\n class=\"h-full overflow-hidden\"\r\n >\r\n <p-tablist>\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tabpanel [value]=\"i.toString()\">\r\n <p class=\"text-xs text-muted py-3 px-4\">\r\n {{ \"structureBuilder.dragToAdd\" | transloco }}\r\n </p>\r\n\r\n <!-- Node List -->\r\n <div class=\"space-y-1 px-4\">\r\n @for (node of currentTabNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{\r\n node.label\r\n }}</span>\r\n </div>\r\n }\r\n\r\n @if (currentTabNodes().length === 0) {\r\n <div class=\"text-center py-8 text-gray-400\">\r\n <p class=\"text-sm\">\r\n {{\r\n \"structureBuilder.allItemsInUse\"\r\n | transloco: { tab: tab }\r\n }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n </ng-template>\r\n </mt-card>\r\n} @else if (availableNodes().length > 0) {\r\n <mt-card\r\n [title]=\"'structureBuilder.steps' | transloco\"\r\n class=\"absolute top-4 start-4 z-1 w-64\"\r\n >\r\n <div class=\"flex flex-col gap-2\">\r\n @for (node of availableNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n}\r\n<!-- Left Sidebar -->\r\n\r\n<!-- Main Canvas Area -->\r\n<div class=\"flex-1 z-0 relative\">\r\n <ng-content select=\"[flowContent]\"></ng-content>\r\n\r\n <f-flow\r\n fDraggable\r\n (fLoaded)=\"onLoaded()\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n class=\"size-full\"\r\n >\r\n <f-background>\r\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\r\n </f-background>\r\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-connection-for-create>\r\n <f-snap-connection\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n class=\"z-1\"\r\n [fSnapThreshold]=\"100\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-snap-connection>\r\n\r\n <f-connection-for-create></f-connection-for-create>\r\n\r\n <!-- Enhanced Connections with Edit Button -->\r\n @for (connection of connectionsComputed(); track connection.id) {\r\n <f-connection\r\n [fReassignDisabled]=\"true\"\r\n [fOutputId]=\"connection.from\"\r\n [fInputId]=\"connection.to\"\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <div\r\n fConnectionCenter\r\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\r\n >\r\n @if (!connection.loading) {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.edit-05'\"\r\n (click)=\"openConnectionDialog(connection)\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n severity=\"danger\"\r\n [icon]=\"'general.trash-01'\"\r\n (click)=\"removeConnection(connection)\"\r\n >\r\n </mt-button>\r\n } @else {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.loading-01'\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </f-connection>\r\n }\r\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n <mt-card\r\n fNode\r\n fDragHandle\r\n [fNodePosition]=\"{\r\n x: node.configuration?.x || 200,\r\n y: node.configuration?.y || 100,\r\n }\"\r\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\r\n [style.--node-data-border-color]=\"node._computedColor\"\r\n >\r\n <ng-template #headless>\r\n @if (!node.loading) {\r\n <div\r\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\r\n >\r\n @if (node._computedIcon) {\r\n <mt-icon\r\n class=\"text-2xl text-primary\"\r\n [icon]=\"node._computedIcon\"\r\n />\r\n }\r\n <div>{{ node._computedName }}</div>\r\n </div>\r\n <div\r\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\r\n >\r\n @for (\r\n action of nodeActions() | filterActions: node;\r\n track action.key\r\n ) {\r\n <mt-button\r\n [size]=\"action?.size || 'small'\"\r\n [variant]=\"action?.variant\"\r\n [icon]=\"action?.icon\"\r\n [tooltip]=\"action?.tooltip\"\r\n [severity]=\"action?.severity\"\r\n (onClick)=\"buttonAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n fInputConnectableSide=\"top\"\r\n [fInputMultiple]=\"true\"\r\n class=\"top\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n fOutputConnectableSide=\"bottom\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\r\n ></div>\r\n } @else {\r\n <p-skeleton height=\"10rem\" width=\"15rem\" />\r\n }\r\n\r\n <!-- Node Header with Edit Button -->\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n<mt-toolbar />\r\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep :root{--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i2$1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId"], outputs: ["fLoaded"] }, { kind: "component", type: i2$1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime"], outputs: ["fCanvasChange"] }, { kind: "component", type: i2$1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i2$1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i2$1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fZoomDblClickStep"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FExternalItemDirective, selector: "[fExternalItem]", inputs: ["fExternalItemId", "fData", "fDisabled", "fPreview", "fPreviewMatchSize", "fPlaceholder"] }, { kind: "component", type: i2$1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fText", "fTextStartOffset", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fSelectionDisabled", "fReassignableStart", "fReassignDisabled", "fInputSide", "fOutputSide"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FConnectionCenterDirective, selector: "[fConnectionCenter]", inputs: ["fConnectionCenter"] }, { kind: "component", type: i2$1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i2$1.FMarkerDirective, selector: "svg[fMarker]", inputs: ["width", "height", "refX", "refY", "type", "orient", "markerUnits"] }, { kind: "component", type: i2$1.FSnapConnectionComponent, selector: "f-snap-connection", inputs: ["fSnapThreshold", "fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i2$1.FNodeInputDirective, selector: "[fNodeInput]", inputs: ["fInputId", "fInputCategory", "fInputMultiple", "fInputDisabled", "fInputConnectableSide"], exportAs: ["fNodeInput"] }, { kind: "directive", type: i2$1.FNodeOutputDirective, selector: "[fNodeOutput]", inputs: ["fOutputId", "fOutputMultiple", "fOutputDisabled", "fOutputConnectableSide", "isSelfConnectable", "fCanBeConnectedInputs"], exportAs: ["fNodeOutput"] }, { kind: "directive", type: i2$1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fConnectOnNode", "fMinimapClass", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fAutoExpandOnChildHit", "fAutoSizeToFitChildren"], outputs: ["fNodePositionChange", "fNodeSizeChange", "fNodeRotateChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i2$1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i2$1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fNodeIntersectedWithConnections", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i3$1.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i3$1.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i3$1.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i3$1.TabList, selector: "p-tablist" }, { kind: "component", type: i3$1.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: Button, selector: "mt-button", inputs: ["icon", "label", "tooltip", "class", "type", "styleClass", "severity", "badge", "variant", "badgeSeverity", "size", "iconPos", "autofocus", "fluid", "raised", "rounded", "text", "plain", "outlined", "link", "disabled", "loading", "pInputs"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Icon, selector: "mt-icon", inputs: ["icon"] }, { kind: "component", type: Card, selector: "mt-card", inputs: ["class", "title", "paddingless"] }, { kind: "component", type: Toolbar, selector: "mt-toolbar", inputs: ["size"] }, { kind: "component", type: Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "pipe", type: i1.TitleCasePipe, name: "titlecase" }, { kind: "pipe", type: FilterActionsPipe, name: "filterActions" }, { kind: "pipe", type: i3.TranslocoPipe, name: "transloco" }] });
479
484
  }
480
485
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: StructureBuilder, decorators: [{
481
486
  type: Component,
@@ -493,7 +498,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
493
498
  TranslocoModule,
494
499
  ], providers: [DialogService], host: {
495
500
  class: 'flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden',
496
- }, template: "<!-- structure-builder.html -->\n@if (availableTabs().length > 0) {\n <mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n >\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">\n {{ \"structureBuilder.levelTemplates\" | transloco }}\n </h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs\n [(value)]=\"activeTab\"\n styleClass=\"structure-tabs \"\n class=\"h-full overflow-hidden\"\n >\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n {{ \"structureBuilder.dragToAdd\" | transloco }}\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.label\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">\n {{\n \"structureBuilder.allItemsInUse\"\n | transloco: { tab: tab }\n }}\n </p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n </mt-card>\n} @else if (availableNodes().length > 0) {\n <mt-card\n [title]=\"'structureBuilder.steps' | transloco\"\n class=\"absolute top-4 start-4 z-1 w-64\"\n >\n <div class=\"flex flex-col gap-2\">\n @for (node of availableNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\n </div>\n }\n </div>\n </mt-card>\n}\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <ng-content select=\"[flowContent]\"></ng-content>\n\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (\n action of nodeActions() | filterActions: node;\n track action.key\n ) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep :root{--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"] }]
501
+ }, template: "<!-- structure-builder.html -->\r\n@if (availableTabs().length > 0) {\r\n <mt-card\r\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\r\n >\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <div class=\"flex items-center justify-between px-4 pt-5\">\r\n <h3 class=\"text-xl font-semibold\">\r\n {{ \"structureBuilder.levelTemplates\" | transloco }}\r\n </h3>\r\n </div>\r\n\r\n <!-- Tabs using PrimeNG -->\r\n <p-tabs\r\n [(value)]=\"activeTab\"\r\n styleClass=\"structure-tabs \"\r\n class=\"h-full overflow-hidden\"\r\n >\r\n <p-tablist>\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tabpanel [value]=\"i.toString()\">\r\n <p class=\"text-xs text-muted py-3 px-4\">\r\n {{ \"structureBuilder.dragToAdd\" | transloco }}\r\n </p>\r\n\r\n <!-- Node List -->\r\n <div class=\"space-y-1 px-4\">\r\n @for (node of currentTabNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{\r\n node.label\r\n }}</span>\r\n </div>\r\n }\r\n\r\n @if (currentTabNodes().length === 0) {\r\n <div class=\"text-center py-8 text-gray-400\">\r\n <p class=\"text-sm\">\r\n {{\r\n \"structureBuilder.allItemsInUse\"\r\n | transloco: { tab: tab }\r\n }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n </ng-template>\r\n </mt-card>\r\n} @else if (availableNodes().length > 0) {\r\n <mt-card\r\n [title]=\"'structureBuilder.steps' | transloco\"\r\n class=\"absolute top-4 start-4 z-1 w-64\"\r\n >\r\n <div class=\"flex flex-col gap-2\">\r\n @for (node of availableNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n}\r\n<!-- Left Sidebar -->\r\n\r\n<!-- Main Canvas Area -->\r\n<div class=\"flex-1 z-0 relative\">\r\n <ng-content select=\"[flowContent]\"></ng-content>\r\n\r\n <f-flow\r\n fDraggable\r\n (fLoaded)=\"onLoaded()\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n class=\"size-full\"\r\n >\r\n <f-background>\r\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\r\n </f-background>\r\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-connection-for-create>\r\n <f-snap-connection\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n class=\"z-1\"\r\n [fSnapThreshold]=\"100\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-snap-connection>\r\n\r\n <f-connection-for-create></f-connection-for-create>\r\n\r\n <!-- Enhanced Connections with Edit Button -->\r\n @for (connection of connectionsComputed(); track connection.id) {\r\n <f-connection\r\n [fReassignDisabled]=\"true\"\r\n [fOutputId]=\"connection.from\"\r\n [fInputId]=\"connection.to\"\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <div\r\n fConnectionCenter\r\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\r\n >\r\n @if (!connection.loading) {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.edit-05'\"\r\n (click)=\"openConnectionDialog(connection)\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n severity=\"danger\"\r\n [icon]=\"'general.trash-01'\"\r\n (click)=\"removeConnection(connection)\"\r\n >\r\n </mt-button>\r\n } @else {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.loading-01'\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </f-connection>\r\n }\r\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n <mt-card\r\n fNode\r\n fDragHandle\r\n [fNodePosition]=\"{\r\n x: node.configuration?.x || 200,\r\n y: node.configuration?.y || 100,\r\n }\"\r\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\r\n [style.--node-data-border-color]=\"node._computedColor\"\r\n >\r\n <ng-template #headless>\r\n @if (!node.loading) {\r\n <div\r\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\r\n >\r\n @if (node._computedIcon) {\r\n <mt-icon\r\n class=\"text-2xl text-primary\"\r\n [icon]=\"node._computedIcon\"\r\n />\r\n }\r\n <div>{{ node._computedName }}</div>\r\n </div>\r\n <div\r\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\r\n >\r\n @for (\r\n action of nodeActions() | filterActions: node;\r\n track action.key\r\n ) {\r\n <mt-button\r\n [size]=\"action?.size || 'small'\"\r\n [variant]=\"action?.variant\"\r\n [icon]=\"action?.icon\"\r\n [tooltip]=\"action?.tooltip\"\r\n [severity]=\"action?.severity\"\r\n (onClick)=\"buttonAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n fInputConnectableSide=\"top\"\r\n [fInputMultiple]=\"true\"\r\n class=\"top\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n fOutputConnectableSide=\"bottom\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\r\n ></div>\r\n } @else {\r\n <p-skeleton height=\"10rem\" width=\"15rem\" />\r\n }\r\n\r\n <!-- Node Header with Edit Button -->\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n<mt-toolbar />\r\n", styles: ["::ng-deep :root{--background-element-color: rgba(0, 0, 0, .1);--selection-area-color: rgba(100, 108, 255, .14);--disabled-color: #e2e2e2;--node-background-color: #ffffff;--node-background-color-inverse: #000000;--node-border-radius: 2px;--node-border-color: rgba(60, 60, 67, .36);--node-selected-border-color: #3451b2;--node-color: rgba(60, 60, 67, .78);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: var(--p-text-color);--snap-connection-color: var(--p-text-muted-color);--connection-gradient-1: #b8272c;--connection-gradient-2: #30a46c;--outlet-color: #3451b2;--input-output-color: rgba(60, 60, 67, .78);--minimap-background-color: #ffffff;--minimap-node-color: rgba(60, 60, 67);--minimap-node-selected-color: var(--p-primary-color);--minimap-view-color: rgba(100, 108, 255, .14)}::ng-deep :root.dark{--background-element-color: rgba(255, 255, 255, .1);--selection-area-color: rgba(100, 108, 255, .16);--disabled-color: #2c2c2e;--node-background-color: #000000;--node-background-color-inverse: #ffffff;--node-border-radius: 2px;--node-border-color: rgba(235, 235, 245, .38);--node-selected-border-color: #a8b1ff;--node-color: rgba(235, 235, 245, .6);--node-shadow: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--connection-color: rgba(235, 235, 245, 1);--snap-connection-color: rgba(235, 235, 245, .2);--connection-gradient-1: #f66f81;--connection-gradient-2: #298459;--outlet-color: #a8b1ff;--input-output-color: rgba(235, 235, 245, .6);--minimap-background-color: #1b1b1f;--minimap-node-color: rgba(255, 255, 245, .86);--minimap-node-selected-color: #a8b1ff;--minimap-view-color: rgba(100, 108, 255, .16)}::ng-deep :root{--form-field-text-color: var(--node-color);--form-field-background: var(--minimap-view-color);--form-field-panel-shadow: var(--shadow-4);--form-field-panel-background: var(--node-background-color);--form-field-active-color: var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection{cursor:pointer}::ng-deep f-flow .f-connection .f-connection-drag-handle{fill:transparent}::ng-deep f-flow .f-connection .f-connection-selection{fill:none}::ng-deep f-flow .f-connection .f-connection-path{fill:none;stroke:var(--connection-color);stroke-width:2}::ng-deep f-flow .f-connection .f-connection-marker{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-marker path,::ng-deep f-flow .f-connection .f-marker circle{fill:var(--connection-color)}::ng-deep f-flow .f-connection .f-connection-text,::ng-deep f-flow .f-connection .f-connection-center{fill:var(--connection-color);color:var(--connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color)}::ng-deep f-flow .f-connection .f-connection-center{display:none}::ng-deep f-flow .f-connection.connection-loading .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-center{display:block}::ng-deep f-flow .f-connection.f-selected .f-connection-path{stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection.f-selected .f-marker path,::ng-deep f-flow .f-connection.f-selected .f-marker circle{fill:var(--p-primary-color);stroke:var(--minimap-node-selected-color)}::ng-deep f-flow .f-connection .f-connection-selection{fill:none;stroke:transparent;stroke-width:20;cursor:pointer}::ng-deep f-flow .f-connection:hover .f-connection-selection{stroke:var(--p-primary-color);opacity:.1}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:2px}::ng-deep f-flow .f-connection.f-snap-connection .f-marker path,::ng-deep f-flow .f-connection.f-snap-connection .f-marker circle{fill:var(--snap-connection-color)}::ng-deep f-flow .f-connection.f-snap-connection .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection.f-connection-for-create .f-connection-selection{fill:transparent!important;stroke:transparent!important}::ng-deep f-flow .f-connection-for-create{pointer-events:none}::ng-deep f-flow .f-connection-for-create .f-connection .f-connection-path{stroke:var(--snap-connection-color);stroke-width:3px;stroke-dasharray:8,4;animation:connection-dash 1s linear infinite}::ng-deep f-flow .f-connection-for-create .f-connection .f-marker path,::ng-deep f-flow .f-connection-for-create .f-connection .f-marker circle{fill:var(--snap-connection-color)}@keyframes connection-dash{to{stroke-dashoffset:-12}}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;width:100%;height:16px;border-radius:0 0 1rem 1rem}.f-node-input:not(.f-node):hover,.f-node-output:not(.f-node):hover{border:.5px dashed var(--p-primary-color)}.f-node-input:not(.f-node).top,.f-node-output:not(.f-node).top{top:0}.f-node-input:not(.f-node).bottom,.f-node-output:not(.f-node).bottom{bottom:0}.f-node-input:not(.f-node).f-node-output-not-connectable,.f-node-input:not(.f-node).f-node-input-not-connectable,.f-node-output:not(.f-node).f-node-output-not-connectable,.f-node-output:not(.f-node).f-node-input-not-connectable{background-color:var(--disabled-color)}.f-node-input:not(.f-node){border-radius:4px}.f-node-input,.f-node-output{z-index:10;pointer-events:all}.examples-toolbar{display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:absolute;right:16px;top:16px}.examples-toolbar button{font-weight:500;border:none;border-radius:2px;padding:4px 8px;line-height:normal}.f-node:before{content:\"\";position:absolute;width:100%;height:4rem;border-radius:var(--radius-2xl);z-index:-1;top:-.25rem;background-color:var(--node-data-border-color)}.connection-center{display:flex;gap:8px;background:var(--node-background-color);border:1px solid var(--node-border-color);border-radius:4px;padding:4px;box-shadow:var(--node-shadow)}.connection-center .connection-edit-btn,.connection-center .connection-delete-btn{background:none;border:none;width:24px;height:24px;border-radius:4px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.connection-center .connection-edit-btn:hover,.connection-center .connection-delete-btn:hover{background-color:var(--minimap-view-color)}.connection-center .connection-edit-btn{color:var(--minimap-node-selected-color)}.connection-center .connection-delete-btn{color:#ef4444}.node-edit-btn,.node-delete-btn{background:none;border:none;width:32px;height:32px;border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .2s ease}.node-edit-btn:hover,.node-delete-btn:hover{background-color:var(--minimap-view-color)}.node-edit-btn{color:var(--minimap-node-selected-color)}.node-delete-btn{color:#ef4444}.node-properties{max-height:200px;overflow-y:auto}.node-properties .property-item{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--node-border-color);font-size:12px}.node-properties .property-item .property-key{font-weight:600;color:var(--node-color);margin-right:8px}.node-properties .property-item .property-value{color:var(--minimap-node-selected-color);word-break:break-word}\n"] }]
497
502
  }], ctorParameters: () => [], propDecorators: { nodeActionsEvent: [{ type: i0.Output, args: ["nodeActionsEvent"] }], action: [{ type: i0.Output, args: ["action"] }], availableNodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableNodes", required: false }] }], fCanvas: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FCanvasComponent), { isSignal: true }] }], fFlowComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FFlowComponent), { isSignal: true }] }], fCanvasComponent: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FCanvasComponent), { isSignal: true }] }], fZoomDirective: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FZoomDirective), { isSignal: true }] }], nodeForm: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeForm", required: false }] }], connectionForm: [{ type: i0.Input, args: [{ isSignal: true, alias: "connectionForm", required: false }] }], nodeActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeActions", required: false }] }], nodeFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeFields", required: false }] }], isAutoLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "isAutoLayout", required: false }] }], addModalType: [{ type: i0.Input, args: [{ isSignal: true, alias: "addModalType", required: false }] }], updateModalType: [{ type: i0.Input, args: [{ isSignal: true, alias: "updateModalType", required: false }] }], addModalStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "addModalStyleClass", required: false }] }], updateModalStyleClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "updateModalStyleClass", required: false }] }], addModalHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "addModalHeader", required: false }] }], updateModalHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "updateModalHeader", required: false }] }], appendTo: [{ type: i0.Input, args: [{ isSignal: true, alias: "appendTo", required: false }] }], nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }, { type: i0.Output, args: ["nodesChange"] }], connections: [{ type: i0.Input, args: [{ isSignal: true, alias: "connections", required: false }] }, { type: i0.Output, args: ["connectionsChange"] }], nodeDialogTemplate: [{ type: i0.ContentChild, args: ['nodeDialog', { isSignal: true }] }] } });
498
503
 
499
504
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"masterteam-structure-builder.mjs","sources":["../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.ts","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.html","../../../../packages/masterteam/structure-builder/src/lib/filter-actions.pipe.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.html","../../../../packages/masterteam/structure-builder/src/public-api.ts","../../../../packages/masterteam/structure-builder/src/masterteam-structure-builder.ts"],"sourcesContent":["import { Component, inject, AfterViewInit, OnInit, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { ModalService } from '@masterteam/components/modal';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoModule } from '@jsverse/transloco';\n\nexport interface NodeFormData {\n id: string;\n label: string;\n description?: string;\n [key: string]: any;\n}\n\n@Component({\n selector: 'mt-node-form-dialog',\n standalone: true,\n imports: [\n CommonModule,\n DynamicForm,\n Button,\n ReactiveFormsModule,\n TranslocoModule,\n ],\n templateUrl: './node-form-dialog.html',\n styleUrls: ['./node-form-dialog.scss'],\n})\nexport class NodeFormDialogComponent implements AfterViewInit, OnInit {\n readonly modalService: ModalService = inject(ModalService);\n ref: ModalRef = inject(ModalRef);\n dynamicFormControl = new FormControl();\n nodeData: NodeFormData;\n formSchema: any;\n data = input<any>(null);\n\n ngOnInit() {\n this.nodeData = this.data()?.node || {};\n this.formSchema = this.data()?.formSchema || [];\n }\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.nodeData);\n }\n get templateContext() {\n return {\n node: this.nodeData,\n save: (item: any = {}) => this.onSave(item),\n cancel: () => this.onCancel(),\n close: () => this.onCancel(),\n };\n }\n onSave(item: any = {}) {\n const updatedNode = {\n ...this.nodeData,\n ...this.dynamicFormControl.value,\n ...item,\n };\n this.ref.close(updatedNode);\n }\n\n onCancel() {\n this.ref.close();\n }\n}\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (this.data()?.template) {\n <ng-container\n *ngTemplateOutlet=\"data().template; context: templateContext\"\n ></ng-container>\n } @else {\n @if (nodeData) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n }\n</div>\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n","import { ModalService } from '@masterteam/components/modal';\nimport { Component, inject, AfterViewInit, input, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\nimport { Button } from '@masterteam/components/button';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { ModalRef } from '@masterteam/components/dialog';\nimport { TranslocoModule } from '@jsverse/transloco';\n\n@Component({\n selector: 'mt-connection-form-dialog',\n standalone: true,\n imports: [\n CommonModule,\n DynamicForm,\n Button,\n ReactiveFormsModule,\n TranslocoModule,\n ],\n templateUrl: './connection-form-dialog.html',\n styleUrls: ['./connection-form-dialog.scss'],\n})\nexport class ConnectionFormDialogComponent implements AfterViewInit, OnInit {\n readonly modalService: ModalService = inject(ModalService);\n private ref: ModalRef = inject(ModalRef);\n data = input<any>(null);\n dynamicFormControl = new FormControl();\n connectionData: any;\n formSchema: any;\n\n ngOnInit() {\n this.connectionData = this.data()?.connection || {};\n this.formSchema = this.data()?.formSchema || [];\n }\n ngAfterViewInit(): void {\n this.dynamicFormControl.setValue(this.connectionData);\n }\n\n onSave(): void {\n if (this.dynamicFormControl.valid) {\n this.ref.close({\n ...this.connectionData,\n ...this.dynamicFormControl.value,\n });\n }\n }\n\n onCancel(): void {\n this.ref.close();\n }\n}\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\n @if (connectionData && formSchema?.sections.length > 0) {\n <mt-dynamic-form\n [formConfig]=\"formSchema\"\n [formControl]=\"dynamicFormControl\"\n ></mt-dynamic-form>\n }\n</div>\n\n<div [class]=\"modalService.footerClass\">\n <mt-button\n [label]=\"'structureBuilder.cancel' | transloco\"\n severity=\"secondary\"\n (onClick)=\"onCancel()\"\n >\n </mt-button>\n <mt-button\n [disabled]=\"!dynamicFormControl.valid\"\n [label]=\"'structureBuilder.saveChanges' | transloco\"\n severity=\"primary\"\n (onClick)=\"onSave()\"\n >\n </mt-button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n inject,\n input,\n} from '@angular/core';\nimport { Button } from '@masterteam/components/button';\nimport { ButtonGroup } from '@masterteam/components/button-group';\nimport { PointExtensions } from '@foblex/2d';\nimport { StructureBuilder } from '../structure-builder';\n\n@Component({\n selector: 'mt-toolbar',\n imports: [Button, ButtonGroup],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './toolbar.html',\n styleUrl: './toolbar.css',\n})\nexport class Toolbar {\n readonly size = input<'small' | 'large' | undefined>();\n\n private builderComponent = inject(StructureBuilder);\n\n public onZoomIn(): void {\n this.builderComponent.fZoomDirective()?.zoomIn();\n }\n\n public onZoomOut(): void {\n this.builderComponent.fZoomDirective()?.zoomOut();\n }\n\n public onFitToScreen(): void {\n this.builderComponent\n .fCanvasComponent()\n ?.fitToScreen(PointExtensions.initialize(250, 250), true);\n }\n\n public onOneToOne(): void {\n this.builderComponent.fCanvasComponent()?.resetScaleAndCenter();\n }\n public autoLayout(): void {\n this.builderComponent.maybeAutoLayout();\n }\n}\n","<mt-button\n (onClick)=\"autoLayout()\"\n class=\"bg-content rounded-(--p-button-border-radius)\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"arrow.refresh-cw-05\"\n></mt-button>\n\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\n <mt-button\n (onClick)=\"onZoomOut()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.minus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onZoomIn()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"general.plus\"\n ></mt-button>\n <mt-button\n (onClick)=\"onFitToScreen()\"\n size=\"size()\"\n variant=\"outlined\"\n severity=\"secondary\"\n icon=\"layout.grid-02\"\n ></mt-button>\n</mt-buttongroup>\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { Actions } from './structure-builder';\n\n@Pipe({\n name: 'filterActions',\n standalone: true,\n pure: true,\n})\nexport class FilterActionsPipe implements PipeTransform {\n transform(actions: Actions[], node: any): Actions[] {\n if (!actions || !Array.isArray(actions)) {\n return [];\n }\n\n return actions.filter((action) => {\n // If no condition is provided, always show the action\n if (!action.condition) {\n return true;\n }\n\n // Evaluate the condition function\n return action.condition(node);\n });\n }\n}\n","import {\n Component,\n input,\n model,\n signal,\n computed,\n inject,\n contentChild,\n TemplateRef,\n viewChild,\n output,\n OnInit,\n} from '@angular/core';\nimport { TranslocoService, TranslocoModule } from '@jsverse/transloco';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DialogService } from '@masterteam/components/dialog';\nimport { DrawerService } from '@masterteam/components/dynamic-drawer';\nimport { ModalService } from '@masterteam/components/modal';\nimport { TabsModule } from 'primeng/tabs';\nimport {\n EFMarkerType,\n FCanvasComponent,\n FCreateConnectionEvent,\n FCreateNodeEvent,\n FFlowComponent,\n FFlowModule,\n FZoomDirective,\n} from '@foblex/flow';\nimport { Button } from '@masterteam/components/button';\nimport { Card } from '@masterteam/components/card';\nimport { Icon } from '@masterteam/icons';\nimport { NodeFormDialogComponent } from './node-form-dialog/node-form-dialog';\nimport { ConnectionFormDialogComponent } from './connection-form-dialog/connection-form-dialog';\nimport { DynamicFormConfig } from '@masterteam/components';\nimport { Toolbar } from './toolbar/toolbar';\nimport { FilterActionsPipe } from './filter-actions.pipe';\n\n// 🔁 dagre & helpers – same approach as lib sample\nimport * as dagre from 'dagre';\nimport { graphlib } from 'dagre';\nimport Graph = graphlib.Graph;\nimport { IPoint, PointExtensions } from '@foblex/2d';\nimport { Skeleton } from 'primeng/skeleton'; // TO DO\n\nexport interface Node {\n configuration?: {\n x?: number;\n y?: number;\n };\n [key: string]: any;\n loading?: boolean;\n}\n\nexport interface NodeFieldsMapping {\n id?: string;\n name?: string;\n icon?: string;\n color?: string;\n}\n\nexport interface AvailableNode {\n id: string;\n label: string;\n icon: string;\n color: string;\n tab: string[];\n [key: string]: any;\n}\n\nexport interface Connection {\n id: string;\n from: string;\n to: string;\n [key: string]: any;\n}\n\nexport interface Actions {\n key: string;\n icon: string;\n variant: string;\n size: string;\n severity?: string;\n tooltip?: string;\n /**\n * Optional condition function to determine if action should be shown\n * @param node - The node object to evaluate\n * @returns true to show the action, false to hide it\n * @example\n * // Show delete only if node is not initial\n * condition: (node) => !node.isInitial\n *\n * // Show edit only if node has specific status\n * condition: (node) => node.status === 'draft'\n */\n condition?: (node: any) => boolean;\n}\n\nexport interface NodeActionEvent {\n action: Actions;\n node: AvailableNode;\n}\n\nexport type SBActionType =\n | 'createNode'\n | 'updateNode'\n | 'deleteNode'\n | 'createConnection'\n | 'updateConnection'\n | 'deleteConnection'\n | 'startCreating'\n | 'startUpdating';\n\nexport interface SBAction {\n action: SBActionType;\n data?: any;\n}\n\n// ✨ Direction & config — mirrors lib sample\nenum Direction {\n LEFT_TO_RIGHT = 'LR',\n TOP_TO_BOTTOM = 'TB',\n}\n\nconst CONFIGURATION = {\n [Direction.LEFT_TO_RIGHT]: {\n // kept for parity; sides aren’t directly used here but available if needed\n outputSide: 'RIGHT',\n inputSide: 'LEFT',\n },\n [Direction.TOP_TO_BOTTOM]: {\n outputSide: 'BOTTOM',\n inputSide: 'TOP',\n },\n} as const;\n\n@Component({\n selector: 'mt-structure-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n FFlowModule,\n TabsModule,\n Button,\n Icon,\n Card,\n Toolbar,\n Skeleton,\n FilterActionsPipe,\n TranslocoModule,\n ],\n templateUrl: './structure-builder.html',\n styleUrl: './structure-builder.scss',\n providers: [DialogService],\n host: {\n class:\n 'flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden',\n },\n})\nexport class StructureBuilder implements OnInit {\n readonly dialogService = inject(DialogService);\n readonly drawerService = inject(DrawerService);\n readonly modal: ModalService = inject(ModalService);\n private transloco = inject(TranslocoService);\n nodeActionsEvent = output<NodeActionEvent>();\n action = output<SBAction>();\n availableNodes = input<AvailableNode[]>([]);\n protected fCanvas = viewChild(FCanvasComponent);\n public fFlowComponent = viewChild(FFlowComponent);\n public fCanvasComponent = viewChild(FCanvasComponent);\n public fZoomDirective = viewChild(FZoomDirective);\n nodeForm = input<DynamicFormConfig>({ sections: [] });\n connectionForm = input<DynamicFormConfig>({ sections: [] });\n nodeActions = input<Actions[]>([]);\n nodeFields = input<NodeFieldsMapping>({\n id: 'id',\n name: 'name',\n icon: 'icon',\n color: 'color',\n });\n\n isAutoLayout = input<boolean>(true);\n addModalType = input<'drawer' | 'dialog'>('dialog');\n updateModalType = input<'drawer' | 'dialog'>('drawer');\n addModalStyleClass = input<string>('!w-[35rem]');\n updateModalStyleClass = input<string>('!w-[35rem]');\n addModalHeader = input<string>('Add Node');\n updateModalHeader = input<string>('Edit Node Properties');\n appendTo = input<string>('');\n nodes = model<Node[]>([]);\n connections = model<Connection[]>([]);\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\n\n activeTab = signal('0');\n protected readonly eMarkerType = EFMarkerType;\n\n protected configuration = signal(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n protected direction = signal<Direction>(Direction.TOP_TO_BOTTOM);\n\n private positions = signal<Record<string, IPoint>>({});\n private dialogRef: any;\n protected fields = computed(() => {\n const inputFields = this.nodeFields();\n return {\n id: inputFields.id || 'id',\n name: inputFields.name || 'name',\n icon: inputFields.icon || 'icon',\n color: inputFields.color || 'color',\n } as any;\n });\n\n availableTabs = computed(() => {\n const tabsSet = new Set<string>();\n this.availableNodes().forEach((node) => {\n if (node.tab && Array.isArray(node.tab)) {\n node.tab.forEach((tab) => tabsSet.add(tab));\n }\n });\n return Array.from(tabsSet).sort();\n });\n\n currentTabNodes = computed(() => {\n const tabs = this.availableTabs();\n const currentTabIndex = parseInt(this.activeTab());\n if (currentTabIndex >= tabs.length) return [];\n const currentTab = tabs[currentTabIndex];\n return this.availableNodes().filter((node) =>\n node.tab.includes(currentTab),\n );\n });\n\n nodesWithComputedProps = computed(() => {\n const fields = this.fields();\n const pos = this.positions();\n return this.nodes().map((node) => {\n const _computedId = String(this.getNestedValue(node, fields.id));\n const _computedName = this.getNestedValue(node, fields.name);\n const _computedIcon = this.getNestedValue(node, fields.icon);\n const _computedColor = this.getNestedValue(node, fields.color);\n const id = _computedId;\n const configuration = {\n ...(node.configuration ?? {}),\n ...(pos[id] ?? {}),\n };\n return {\n ...node,\n _computedId,\n _computedName,\n _computedIcon,\n _computedColor,\n configuration,\n };\n });\n });\n connectionsComputed = computed(() =>\n this.connections()?.map((c) => ({\n ...c,\n from: String(c.from),\n to: String(c.to),\n })),\n );\n coreFields = computed(() => {\n const fields = this.fields();\n return new Set([\n ...Object.values(fields),\n 'configuration',\n '_computedId',\n '_computedName',\n '_computedIcon',\n '_computedColor',\n ]);\n });\n\n constructor() {}\n\n public ngOnInit(): void {\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n protected onLoaded(): void {\n this.fitToScreen();\n }\n\n onCreateNode(event: FCreateNodeEvent): void {\n const nodeData = event.data as AvailableNode;\n if (!nodeData) return;\n\n const newNode: Node = {\n ...nodeData,\n configuration: {\n x: event.rect.x,\n y: event.rect.y,\n },\n };\n\n if (this.nodeForm()?.sections.length > 0 || this.nodeDialogTemplate()) {\n this.openNodeDialog(newNode, true);\n } else {\n this.action.emit({ action: 'createNode', data: newNode });\n }\n }\n\n onNodePositionChange(event: any, nodeId: string): void {\n const position = event;\n if (nodeId && position) {\n this.positions.update((p) => ({\n ...p,\n [nodeId]: { x: position.x, y: position.y },\n }));\n }\n }\n\n onCreateConnection(event: FCreateConnectionEvent): void {\n const newConnection: Connection = {\n id: this.generateConnectionId(),\n from: event.fOutputId!,\n to: event.fInputId!,\n };\n if (!event.fInputId! || !event.fOutputId!) {\n return;\n }\n const exists = this.connectionsComputed().some(\n (conn) =>\n conn.from === newConnection.from && conn.to === newConnection.to,\n );\n\n if (!exists) {\n this.action.emit({ action: 'createConnection', data: newConnection });\n }\n }\n\n openNodeDialog(node: Node, isNewNode: boolean = false): void {\n if (this.dialogRef) {\n this.dialogRef.close();\n }\n const modalType = isNewNode ? this.addModalType() : this.updateModalType();\n this.action.emit({\n action: isNewNode ? 'startCreating' : 'startUpdating',\n data: node,\n });\n\n const styleClass = isNewNode\n ? this.addModalStyleClass()\n : this.updateModalStyleClass();\n const header = isNewNode ? this.addModalHeader() : this.updateModalHeader();\n\n const config = {\n header: header,\n styleClass: styleClass,\n focusOnShow: this.nodeDialogTemplate() ? false : true,\n appendTo: this.appendTo(),\n position: modalType === 'drawer' ? 'end' : undefined,\n inputValues: {\n data: {\n node: node,\n formSchema: this.nodeForm(),\n template: this.nodeDialogTemplate(),\n },\n },\n };\n this.dialogRef = this.modal.openModal(\n NodeFormDialogComponent,\n modalType,\n config,\n );\n\n this.dialogRef.onClose.subscribe((result: any) => {\n if (result) {\n if (isNewNode) {\n const newNodeWithFormData = { ...node, ...result };\n this.action.emit({ action: 'createNode', data: newNodeWithFormData });\n } else {\n this.onNodeFormSubmit(result);\n }\n }\n });\n }\n\n openConnectionDialog(connection: Connection): void {\n const ref = this.modal.openModal(ConnectionFormDialogComponent, 'dialog', {\n header: this.transloco.translate(\n 'structureBuilder.editConnectionProperties',\n ),\n width: '600px',\n\n inputValues: {\n data: {\n connection: connection,\n formSchema: this.connectionForm(),\n },\n },\n });\n\n ref.onClose.subscribe((result: any) => {\n if (result) {\n this.onConnectionFormSubmit(result);\n }\n });\n }\n\n onNodeFormSubmit(formData: any): void {\n const nodeId = formData[this.fields().id];\n if (nodeId) {\n this.action.emit({ action: 'updateNode', data: formData });\n }\n }\n\n onConnectionFormSubmit(formData: any): void {\n const connectionId = formData.id;\n if (connectionId) {\n this.action.emit({ action: 'updateConnection', data: formData });\n }\n }\n\n removeNode(node: any): void {\n this.action.emit({ action: 'deleteNode', data: node });\n }\n\n removeConnection(connection: any): void {\n this.action.emit({ action: 'deleteConnection', data: connection });\n }\n\n buttonAction(action: any, node: any) {\n this.nodeActionsEvent.emit({ action, node });\n if (action.key === 'edit') {\n this.openNodeDialog(node);\n } else if (action.key === 'delete') {\n this.removeNode(node);\n }\n }\n\n protected fitToScreen(): void {\n const area = this.nodes()?.length * 70;\n this.fCanvasComponent()?.fitToScreen(\n PointExtensions.initialize(area, area),\n false,\n );\n }\n\n private getData(graph: Graph, direction: Direction): void {\n this.direction.set(direction);\n if (this.isAutoLayout()) {\n this.fFlowComponent()?.reset();\n }\n this.updateGraph(graph, direction);\n this.applyGraphPositions(graph);\n }\n\n private updateGraph(graph: Graph, direction: Direction): void {\n this.configuration.set(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\n graph.setGraph({ rankdir: direction });\n\n const SIZE = { width: 300, height: 200 };\n this.nodes().forEach((n) => {\n graph.setNode(n[this.fields().id], {\n width: SIZE.width,\n height: SIZE.height,\n });\n });\n\n this.connectionsComputed().forEach((c) => {\n const fromId = c.from;\n const toId = c.to;\n if (fromId && toId && fromId !== toId) {\n graph.setEdge(fromId, toId, {});\n }\n });\n\n dagre.layout(graph);\n }\n\n private applyGraphPositions(graph: Graph): void {\n const positionsById: Record<string, IPoint> = {};\n graph.nodes().forEach((key) => {\n const gNode = graph.node(key);\n positionsById[key] = { x: gNode.x, y: gNode.y };\n });\n this.positions.update((old) => ({ ...old, ...positionsById }));\n }\n\n private getNestedValue(obj: unknown, path?: string | null): unknown {\n if (!path) return undefined;\n const keys = path\n .replace(/\\[(\\w+)\\]/g, '.$1')\n .replace(/^\\./, '')\n .split('.')\n .filter(Boolean);\n\n return keys.reduce<unknown>(\n (acc, k) => (acc == null ? undefined : (acc as any)[k]),\n obj,\n );\n }\n\n maybeAutoLayout(): void {\n if (!this.isAutoLayout() || this.nodes().length === 0) return;\n this.getData(new dagre.graphlib.Graph(), this.direction());\n }\n\n private generateConnectionId(): string {\n return `conn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private extractNodeId(connectionEndId: string): string {\n return (connectionEndId || '').replace(/-(in|out)$/, '');\n }\n}\n","<!-- structure-builder.html -->\n@if (availableTabs().length > 0) {\n <mt-card\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\n >\n <ng-template #headless>\n <!-- Header -->\n <div class=\"flex items-center justify-between px-4 pt-5\">\n <h3 class=\"text-xl font-semibold\">\n {{ \"structureBuilder.levelTemplates\" | transloco }}\n </h3>\n </div>\n\n <!-- Tabs using PrimeNG -->\n <p-tabs\n [(value)]=\"activeTab\"\n styleClass=\"structure-tabs \"\n class=\"h-full overflow-hidden\"\n >\n <p-tablist>\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\n }\n </p-tablist>\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\n @for (tab of availableTabs(); track tab; let i = $index) {\n <p-tabpanel [value]=\"i.toString()\">\n <p class=\"text-xs text-muted py-3 px-4\">\n {{ \"structureBuilder.dragToAdd\" | transloco }}\n </p>\n\n <!-- Node List -->\n <div class=\"space-y-1 px-4\">\n @for (node of currentTabNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{\n node.label\n }}</span>\n </div>\n }\n\n @if (currentTabNodes().length === 0) {\n <div class=\"text-center py-8 text-gray-400\">\n <p class=\"text-sm\">\n {{\n \"structureBuilder.allItemsInUse\"\n | transloco: { tab: tab }\n }}\n </p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n </ng-template>\n </mt-card>\n} @else if (availableNodes().length > 0) {\n <mt-card\n [title]=\"'structureBuilder.steps' | transloco\"\n class=\"absolute top-4 start-4 z-1 w-64\"\n >\n <div class=\"flex flex-col gap-2\">\n @for (node of availableNodes(); track node.id) {\n <div\n fExternalItem\n [fData]=\"node\"\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\n >\n <!-- Node Icon with color -->\n <div class=\"text-primary text-lg\">\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\n </div>\n\n <!-- Node Name -->\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\n </div>\n }\n </div>\n </mt-card>\n}\n<!-- Left Sidebar -->\n\n<!-- Main Canvas Area -->\n<div class=\"flex-1 z-0 relative\">\n <ng-content select=\"[flowContent]\"></ng-content>\n\n <f-flow\n fDraggable\n (fLoaded)=\"onLoaded()\"\n (fCreateNode)=\"onCreateNode($event)\"\n (fCreateConnection)=\"onCreateConnection($event)\"\n class=\"size-full\"\n >\n <f-background>\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\n </f-background>\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-connection-for-create>\n <f-snap-connection\n fBehavior=\"fixed\"\n fType=\"segment\"\n class=\"z-1\"\n [fSnapThreshold]=\"100\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n </f-snap-connection>\n\n <f-connection-for-create></f-connection-for-create>\n\n <!-- Enhanced Connections with Edit Button -->\n @for (connection of connectionsComputed(); track connection.id) {\n <f-connection\n [fReassignDisabled]=\"true\"\n [fOutputId]=\"connection.from\"\n [fInputId]=\"connection.to\"\n fBehavior=\"fixed\"\n fType=\"segment\"\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\n >\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_START\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <svg\n viewBox=\"0 0 12 12\"\n fMarker\n [type]=\"eMarkerType.SELECTED_END\"\n [height]=\"12\"\n [width]=\"12\"\n [refX]=\"6\"\n [refY]=\"6\"\n >\n <circle\n cx=\"6\"\n cy=\"6\"\n r=\"3\"\n stroke=\"none\"\n fill=\"currentColor\"\n ></circle>\n </svg>\n <div\n fConnectionCenter\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\n >\n @if (!connection.loading) {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.edit-05'\"\n (click)=\"openConnectionDialog(connection)\"\n >\n </mt-button>\n <mt-button\n size=\"small\"\n variant=\"text\"\n severity=\"danger\"\n [icon]=\"'general.trash-01'\"\n (click)=\"removeConnection(connection)\"\n >\n </mt-button>\n } @else {\n <mt-button\n size=\"small\"\n variant=\"text\"\n [icon]=\"'general.loading-01'\"\n >\n </mt-button>\n }\n </div>\n </f-connection>\n }\n\n <!-- Enhanced Nodes with Edit Button -->\n @for (node of nodesWithComputedProps(); track node._computedId) {\n <mt-card\n fNode\n fDragHandle\n [fNodePosition]=\"{\n x: node.configuration?.x || 200,\n y: node.configuration?.y || 100,\n }\"\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\n [style.--node-data-border-color]=\"node._computedColor\"\n >\n <ng-template #headless>\n @if (!node.loading) {\n <div\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\n >\n @if (node._computedIcon) {\n <mt-icon\n class=\"text-2xl text-primary\"\n [icon]=\"node._computedIcon\"\n />\n }\n <div>{{ node._computedName }}</div>\n </div>\n <div\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\n >\n @for (\n action of nodeActions() | filterActions: node;\n track action.key\n ) {\n <mt-button\n [size]=\"action?.size || 'small'\"\n [variant]=\"action?.variant\"\n [icon]=\"action?.icon\"\n [tooltip]=\"action?.tooltip\"\n [severity]=\"action?.severity\"\n (onClick)=\"buttonAction(action, node)\"\n >\n </mt-button>\n }\n </div>\n <div\n fNodeInput\n [fInputId]=\"node._computedId\"\n fInputConnectableSide=\"top\"\n [fInputMultiple]=\"true\"\n class=\"top\"\n ></div>\n\n <div\n fNodeOutput\n [fOutputId]=\"node._computedId\"\n fOutputConnectableSide=\"bottom\"\n [isSelfConnectable]=\"false\"\n [fOutputMultiple]=\"true\"\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\n ></div>\n } @else {\n <p-skeleton height=\"10rem\" width=\"15rem\" />\n }\n\n <!-- Node Header with Edit Button -->\n </ng-template>\n </mt-card>\n }\n </f-canvas>\n </f-flow>\n</div>\n<mt-toolbar />\n","/*\n * Public API Surface of structure-builder\n */\n\nexport * from './lib/structure-builder';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4"],"mappings":"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"}
1
+ {"version":3,"file":"masterteam-structure-builder.mjs","sources":["../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/node-form-dialog/node-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.ts","../../../../packages/masterteam/structure-builder/src/lib/connection-form-dialog/connection-form-dialog.html","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.ts","../../../../packages/masterteam/structure-builder/src/lib/toolbar/toolbar.html","../../../../packages/masterteam/structure-builder/src/lib/filter-actions.pipe.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.ts","../../../../packages/masterteam/structure-builder/src/lib/structure-builder.html","../../../../packages/masterteam/structure-builder/src/public-api.ts","../../../../packages/masterteam/structure-builder/src/masterteam-structure-builder.ts"],"sourcesContent":["import { Component, inject, AfterViewInit, OnInit, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { DrawerController } from '@masterteam/components/dynamic-drawer';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\nexport interface NodeFormData {\r\n id: string;\r\n label: string;\r\n description?: string;\r\n [key: string]: any;\r\n}\r\n\r\n@Component({\r\n selector: 'mt-node-form-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicForm,\r\n Button,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './node-form-dialog.html',\r\n styleUrls: ['./node-form-dialog.scss'],\r\n})\r\nexport class NodeFormDialogComponent implements AfterViewInit, OnInit {\r\n readonly modalService: ModalService = inject(ModalService);\r\n ref: ModalRef = inject(ModalRef);\r\n // DrawerController is optional - only available when opened as drawer\r\n readonly drawerController = inject(DrawerController, { optional: true });\r\n dynamicFormControl = new FormControl();\r\n nodeData: NodeFormData;\r\n formSchema: any;\r\n data = input<any>(null);\r\n\r\n ngOnInit() {\r\n this.nodeData = this.data()?.node || {};\r\n this.formSchema = this.data()?.formSchema || [];\r\n }\r\n ngAfterViewInit(): void {\r\n this.dynamicFormControl.setValue(this.nodeData);\r\n }\r\n get templateContext() {\r\n return {\r\n node: this.nodeData,\r\n save: (item: any = {}) => this.onSave(item),\r\n cancel: () => this.onCancel(),\r\n close: () => this.onCancel(),\r\n drawerController: this.drawerController,\r\n };\r\n }\r\n onSave(item: any = {}) {\r\n const updatedNode = {\r\n ...this.nodeData,\r\n ...this.dynamicFormControl.value,\r\n ...item,\r\n };\r\n this.ref.close(updatedNode);\r\n }\r\n\r\n onCancel() {\r\n this.ref.close();\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (this.data()?.template) {\r\n <ng-container\r\n *ngTemplateOutlet=\"data().template; context: templateContext\"\r\n ></ng-container>\r\n } @else {\r\n @if (nodeData) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n }\r\n</div>\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n","import { ModalService } from '@masterteam/components/modal';\r\nimport { Component, inject, AfterViewInit, input, OnInit } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { DynamicForm } from '@masterteam/forms/dynamic-form';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\r\nimport { ModalRef } from '@masterteam/components/dialog';\r\nimport { TranslocoModule } from '@jsverse/transloco';\r\n\r\n@Component({\r\n selector: 'mt-connection-form-dialog',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n DynamicForm,\r\n Button,\r\n ReactiveFormsModule,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './connection-form-dialog.html',\r\n styleUrls: ['./connection-form-dialog.scss'],\r\n})\r\nexport class ConnectionFormDialogComponent implements AfterViewInit, OnInit {\r\n readonly modalService: ModalService = inject(ModalService);\r\n private ref: ModalRef = inject(ModalRef);\r\n data = input<any>(null);\r\n dynamicFormControl = new FormControl();\r\n connectionData: any;\r\n formSchema: any;\r\n\r\n ngOnInit() {\r\n this.connectionData = this.data()?.connection || {};\r\n this.formSchema = this.data()?.formSchema || [];\r\n }\r\n ngAfterViewInit(): void {\r\n this.dynamicFormControl.setValue(this.connectionData);\r\n }\r\n\r\n onSave(): void {\r\n if (this.dynamicFormControl.valid) {\r\n this.ref.close({\r\n ...this.connectionData,\r\n ...this.dynamicFormControl.value,\r\n });\r\n }\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close();\r\n }\r\n}\r\n","<div [class]=\"[modalService.contentClass, 'p-4']\">\r\n @if (connectionData && formSchema?.sections.length > 0) {\r\n <mt-dynamic-form\r\n [formConfig]=\"formSchema\"\r\n [formControl]=\"dynamicFormControl\"\r\n ></mt-dynamic-form>\r\n }\r\n</div>\r\n\r\n<div [class]=\"modalService.footerClass\">\r\n <mt-button\r\n [label]=\"'structureBuilder.cancel' | transloco\"\r\n severity=\"secondary\"\r\n (onClick)=\"onCancel()\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n [disabled]=\"!dynamicFormControl.valid\"\r\n [label]=\"'structureBuilder.saveChanges' | transloco\"\r\n severity=\"primary\"\r\n (onClick)=\"onSave()\"\r\n >\r\n </mt-button>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { ButtonGroup } from '@masterteam/components/button-group';\r\nimport { PointExtensions } from '@foblex/2d';\r\nimport { StructureBuilder } from '../structure-builder';\r\n\r\n@Component({\r\n selector: 'mt-toolbar',\r\n imports: [Button, ButtonGroup],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n templateUrl: './toolbar.html',\r\n styleUrl: './toolbar.css',\r\n})\r\nexport class Toolbar {\r\n readonly size = input<'small' | 'large' | undefined>();\r\n\r\n private builderComponent = inject(StructureBuilder);\r\n\r\n public onZoomIn(): void {\r\n this.builderComponent.fZoomDirective()?.zoomIn();\r\n }\r\n\r\n public onZoomOut(): void {\r\n this.builderComponent.fZoomDirective()?.zoomOut();\r\n }\r\n\r\n public onFitToScreen(): void {\r\n this.builderComponent\r\n .fCanvasComponent()\r\n ?.fitToScreen(PointExtensions.initialize(250, 250), true);\r\n }\r\n\r\n public onOneToOne(): void {\r\n this.builderComponent.fCanvasComponent()?.resetScaleAndCenter();\r\n }\r\n public autoLayout(): void {\r\n this.builderComponent.maybeAutoLayout();\r\n }\r\n}\r\n","<mt-button\r\n (onClick)=\"autoLayout()\"\r\n class=\"bg-content rounded-(--p-button-border-radius)\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"arrow.refresh-cw-05\"\r\n></mt-button>\r\n\r\n<mt-buttongroup class=\"bg-content rounded-(--p-button-border-radius)\">\r\n <mt-button\r\n (onClick)=\"onZoomOut()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.minus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onZoomIn()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"general.plus\"\r\n ></mt-button>\r\n <mt-button\r\n (onClick)=\"onFitToScreen()\"\r\n size=\"size()\"\r\n variant=\"outlined\"\r\n severity=\"secondary\"\r\n icon=\"layout.grid-02\"\r\n ></mt-button>\r\n</mt-buttongroup>\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { Actions } from './structure-builder';\r\n\r\n@Pipe({\r\n name: 'filterActions',\r\n standalone: true,\r\n pure: true,\r\n})\r\nexport class FilterActionsPipe implements PipeTransform {\r\n transform(actions: Actions[], node: any): Actions[] {\r\n if (!actions || !Array.isArray(actions)) {\r\n return [];\r\n }\r\n\r\n return actions.filter((action) => {\r\n // If no condition is provided, always show the action\r\n if (!action.condition) {\r\n return true;\r\n }\r\n\r\n // Evaluate the condition function\r\n return action.condition(node);\r\n });\r\n }\r\n}\r\n","import {\r\n Component,\r\n input,\r\n model,\r\n signal,\r\n computed,\r\n inject,\r\n contentChild,\r\n TemplateRef,\r\n viewChild,\r\n output,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { TranslocoService, TranslocoModule } from '@jsverse/transloco';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { DialogService } from '@masterteam/components/dialog';\r\nimport { DrawerService } from '@masterteam/components/dynamic-drawer';\r\nimport { ModalService } from '@masterteam/components/modal';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport {\r\n EFMarkerType,\r\n FCanvasComponent,\r\n FCreateConnectionEvent,\r\n FCreateNodeEvent,\r\n FFlowComponent,\r\n FFlowModule,\r\n FZoomDirective,\r\n} from '@foblex/flow';\r\nimport { Button } from '@masterteam/components/button';\r\nimport { Card } from '@masterteam/components/card';\r\nimport { Icon } from '@masterteam/icons';\r\nimport { NodeFormDialogComponent } from './node-form-dialog/node-form-dialog';\r\nimport { ConnectionFormDialogComponent } from './connection-form-dialog/connection-form-dialog';\r\nimport { DynamicFormConfig } from '@masterteam/components';\r\nimport { Toolbar } from './toolbar/toolbar';\r\nimport { FilterActionsPipe } from './filter-actions.pipe';\r\n\r\n// 🔁 dagre & helpers – same approach as lib sample\r\nimport * as dagre from 'dagre';\r\nimport { graphlib } from 'dagre';\r\nimport Graph = graphlib.Graph;\r\nimport { IPoint, PointExtensions } from '@foblex/2d';\r\nimport { Skeleton } from 'primeng/skeleton'; // TO DO\r\n\r\nexport interface Node {\r\n configuration?: {\r\n x?: number;\r\n y?: number;\r\n };\r\n [key: string]: any;\r\n loading?: boolean;\r\n}\r\n\r\nexport interface NodeFieldsMapping {\r\n id?: string;\r\n name?: string;\r\n icon?: string;\r\n color?: string;\r\n}\r\n\r\nexport interface AvailableNode {\r\n id: string;\r\n label: string;\r\n icon: string;\r\n color: string;\r\n tab: string[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Connection {\r\n id: string;\r\n from: string;\r\n to: string;\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Actions {\r\n key: string;\r\n icon: string;\r\n variant: string;\r\n size: string;\r\n severity?: string;\r\n tooltip?: string;\r\n /**\r\n * Optional condition function to determine if action should be shown\r\n * @param node - The node object to evaluate\r\n * @returns true to show the action, false to hide it\r\n * @example\r\n * // Show delete only if node is not initial\r\n * condition: (node) => !node.isInitial\r\n *\r\n * // Show edit only if node has specific status\r\n * condition: (node) => node.status === 'draft'\r\n */\r\n condition?: (node: any) => boolean;\r\n}\r\n\r\nexport interface NodeActionEvent {\r\n action: Actions;\r\n node: AvailableNode;\r\n}\r\n\r\nexport type SBActionType =\r\n | 'createNode'\r\n | 'updateNode'\r\n | 'deleteNode'\r\n | 'createConnection'\r\n | 'updateConnection'\r\n | 'deleteConnection'\r\n | 'startCreating'\r\n | 'startUpdating';\r\n\r\nexport interface SBAction {\r\n action: SBActionType;\r\n data?: any;\r\n}\r\n\r\n// ✨ Direction & config — mirrors lib sample\r\nenum Direction {\r\n LEFT_TO_RIGHT = 'LR',\r\n TOP_TO_BOTTOM = 'TB',\r\n}\r\n\r\nconst CONFIGURATION = {\r\n [Direction.LEFT_TO_RIGHT]: {\r\n // kept for parity; sides aren’t directly used here but available if needed\r\n outputSide: 'RIGHT',\r\n inputSide: 'LEFT',\r\n },\r\n [Direction.TOP_TO_BOTTOM]: {\r\n outputSide: 'BOTTOM',\r\n inputSide: 'TOP',\r\n },\r\n} as const;\r\n\r\n@Component({\r\n selector: 'mt-structure-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n FFlowModule,\r\n TabsModule,\r\n Button,\r\n Icon,\r\n Card,\r\n Toolbar,\r\n Skeleton,\r\n FilterActionsPipe,\r\n TranslocoModule,\r\n ],\r\n templateUrl: './structure-builder.html',\r\n styleUrl: './structure-builder.scss',\r\n providers: [DialogService],\r\n host: {\r\n class:\r\n 'flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden',\r\n },\r\n})\r\nexport class StructureBuilder implements OnInit {\r\n readonly dialogService = inject(DialogService);\r\n readonly drawerService = inject(DrawerService);\r\n readonly modal: ModalService = inject(ModalService);\r\n private transloco = inject(TranslocoService);\r\n nodeActionsEvent = output<NodeActionEvent>();\r\n action = output<SBAction>();\r\n availableNodes = input<AvailableNode[]>([]);\r\n protected fCanvas = viewChild(FCanvasComponent);\r\n public fFlowComponent = viewChild(FFlowComponent);\r\n public fCanvasComponent = viewChild(FCanvasComponent);\r\n public fZoomDirective = viewChild(FZoomDirective);\r\n nodeForm = input<DynamicFormConfig>({ sections: [] });\r\n connectionForm = input<DynamicFormConfig>({ sections: [] });\r\n nodeActions = input<Actions[]>([]);\r\n nodeFields = input<NodeFieldsMapping>({\r\n id: 'id',\r\n name: 'name',\r\n icon: 'icon',\r\n color: 'color',\r\n });\r\n\r\n isAutoLayout = input<boolean>(true);\r\n addModalType = input<'drawer' | 'dialog'>('dialog');\r\n updateModalType = input<'drawer' | 'dialog'>('drawer');\r\n addModalStyleClass = input<string>('!w-[35rem]');\r\n updateModalStyleClass = input<string>('!w-[35rem]');\r\n addModalHeader = input<string>('Add Node');\r\n updateModalHeader = input<string>('Edit Node Properties');\r\n appendTo = input<string>('');\r\n nodes = model<Node[]>([]);\r\n connections = model<Connection[]>([]);\r\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\r\n\r\n activeTab = signal('0');\r\n protected readonly eMarkerType = EFMarkerType;\r\n\r\n protected configuration = signal(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\r\n protected direction = signal<Direction>(Direction.TOP_TO_BOTTOM);\r\n\r\n private positions = signal<Record<string, IPoint>>({});\r\n private dialogRef: any;\r\n protected fields = computed(() => {\r\n const inputFields = this.nodeFields();\r\n return {\r\n id: inputFields.id || 'id',\r\n name: inputFields.name || 'name',\r\n icon: inputFields.icon || 'icon',\r\n color: inputFields.color || 'color',\r\n } as any;\r\n });\r\n\r\n availableTabs = computed(() => {\r\n const tabsSet = new Set<string>();\r\n this.availableNodes().forEach((node) => {\r\n if (node.tab && Array.isArray(node.tab)) {\r\n node.tab.forEach((tab) => tabsSet.add(tab));\r\n }\r\n });\r\n return Array.from(tabsSet).sort();\r\n });\r\n\r\n currentTabNodes = computed(() => {\r\n const tabs = this.availableTabs();\r\n const currentTabIndex = parseInt(this.activeTab());\r\n if (currentTabIndex >= tabs.length) return [];\r\n const currentTab = tabs[currentTabIndex];\r\n return this.availableNodes().filter((node) =>\r\n node.tab.includes(currentTab),\r\n );\r\n });\r\n\r\n nodesWithComputedProps = computed(() => {\r\n const fields = this.fields();\r\n const pos = this.positions();\r\n return this.nodes().map((node) => {\r\n const _computedId = String(this.getNestedValue(node, fields.id));\r\n const _computedName = this.getNestedValue(node, fields.name);\r\n const _computedIcon = this.getNestedValue(node, fields.icon);\r\n const _computedColor = this.getNestedValue(node, fields.color);\r\n const id = _computedId;\r\n const configuration = {\r\n ...(node.configuration ?? {}),\r\n ...(pos[id] ?? {}),\r\n };\r\n return {\r\n ...node,\r\n _computedId,\r\n _computedName,\r\n _computedIcon,\r\n _computedColor,\r\n configuration,\r\n };\r\n });\r\n });\r\n connectionsComputed = computed(() =>\r\n this.connections()?.map((c) => ({\r\n ...c,\r\n from: String(c.from),\r\n to: String(c.to),\r\n })),\r\n );\r\n coreFields = computed(() => {\r\n const fields = this.fields();\r\n return new Set([\r\n ...Object.values(fields),\r\n 'configuration',\r\n '_computedId',\r\n '_computedName',\r\n '_computedIcon',\r\n '_computedColor',\r\n ]);\r\n });\r\n\r\n constructor() {}\r\n\r\n public ngOnInit(): void {\r\n this.getData(new dagre.graphlib.Graph(), this.direction());\r\n }\r\n\r\n protected onLoaded(): void {\r\n this.fitToScreen();\r\n }\r\n\r\n onCreateNode(event: FCreateNodeEvent): void {\r\n const nodeData = event.data as AvailableNode;\r\n if (!nodeData) return;\r\n\r\n const newNode: Node = {\r\n ...nodeData,\r\n configuration: {\r\n x: event.rect.x,\r\n y: event.rect.y,\r\n },\r\n };\r\n\r\n if (this.nodeForm()?.sections.length > 0 || this.nodeDialogTemplate()) {\r\n this.openNodeDialog(newNode, true);\r\n } else {\r\n this.action.emit({ action: 'createNode', data: newNode });\r\n }\r\n }\r\n\r\n onNodePositionChange(event: any, nodeId: string): void {\r\n const position = event;\r\n if (nodeId && position) {\r\n this.positions.update((p) => ({\r\n ...p,\r\n [nodeId]: { x: position.x, y: position.y },\r\n }));\r\n }\r\n }\r\n\r\n onCreateConnection(event: FCreateConnectionEvent): void {\r\n const newConnection: Connection = {\r\n id: this.generateConnectionId(),\r\n from: event.fOutputId!,\r\n to: event.fInputId!,\r\n };\r\n if (!event.fInputId! || !event.fOutputId!) {\r\n return;\r\n }\r\n const exists = this.connectionsComputed().some(\r\n (conn) =>\r\n conn.from === newConnection.from && conn.to === newConnection.to,\r\n );\r\n\r\n if (!exists) {\r\n this.action.emit({ action: 'createConnection', data: newConnection });\r\n }\r\n }\r\n\r\n openNodeDialog(node: Node, isNewNode: boolean = false): void {\r\n if (this.dialogRef) {\r\n this.dialogRef.close();\r\n }\r\n const modalType = isNewNode ? this.addModalType() : this.updateModalType();\r\n this.action.emit({\r\n action: isNewNode ? 'startCreating' : 'startUpdating',\r\n data: node,\r\n });\r\n\r\n const styleClass = isNewNode\r\n ? this.addModalStyleClass()\r\n : this.updateModalStyleClass();\r\n const header = isNewNode ? this.addModalHeader() : this.updateModalHeader();\r\n\r\n const config = {\r\n header: header,\r\n styleClass: styleClass,\r\n focusOnShow: this.nodeDialogTemplate() ? false : true,\r\n appendTo: this.appendTo(),\r\n position: modalType === 'drawer' ? 'end' : undefined,\r\n dismissible: true,\r\n modal: true,\r\n\r\n inputValues: {\r\n data: {\r\n node: node,\r\n formSchema: this.nodeForm(),\r\n template: this.nodeDialogTemplate(),\r\n },\r\n },\r\n };\r\n this.dialogRef = this.modal.openModal(\r\n NodeFormDialogComponent,\r\n modalType,\r\n config,\r\n );\r\n\r\n this.dialogRef.onClose.subscribe((result: any) => {\r\n if (result) {\r\n if (isNewNode) {\r\n const newNodeWithFormData = { ...node, ...result };\r\n this.action.emit({ action: 'createNode', data: newNodeWithFormData });\r\n } else {\r\n this.onNodeFormSubmit(result);\r\n }\r\n }\r\n });\r\n }\r\n\r\n openConnectionDialog(connection: Connection): void {\r\n const ref = this.modal.openModal(ConnectionFormDialogComponent, 'dialog', {\r\n header: this.transloco.translate(\r\n 'structureBuilder.editConnectionProperties',\r\n ),\r\n width: '600px',\r\n\r\n inputValues: {\r\n data: {\r\n connection: connection,\r\n formSchema: this.connectionForm(),\r\n },\r\n },\r\n });\r\n\r\n ref.onClose.subscribe((result: any) => {\r\n if (result) {\r\n this.onConnectionFormSubmit(result);\r\n }\r\n });\r\n }\r\n\r\n onNodeFormSubmit(formData: any): void {\r\n const nodeId = formData[this.fields().id];\r\n if (nodeId) {\r\n this.action.emit({ action: 'updateNode', data: formData });\r\n }\r\n }\r\n\r\n onConnectionFormSubmit(formData: any): void {\r\n const connectionId = formData.id;\r\n if (connectionId) {\r\n this.action.emit({ action: 'updateConnection', data: formData });\r\n }\r\n }\r\n\r\n removeNode(node: any): void {\r\n this.action.emit({ action: 'deleteNode', data: node });\r\n }\r\n\r\n removeConnection(connection: any): void {\r\n this.action.emit({ action: 'deleteConnection', data: connection });\r\n }\r\n\r\n buttonAction(action: any, node: any) {\r\n this.nodeActionsEvent.emit({ action, node });\r\n if (action.key === 'edit') {\r\n this.openNodeDialog(node);\r\n } else if (action.key === 'delete') {\r\n this.removeNode(node);\r\n }\r\n }\r\n\r\n protected fitToScreen(): void {\r\n const area = this.nodes()?.length * 70;\r\n this.fCanvasComponent()?.fitToScreen(\r\n PointExtensions.initialize(area, area),\r\n false,\r\n );\r\n }\r\n\r\n private getData(graph: Graph, direction: Direction): void {\r\n this.direction.set(direction);\r\n if (this.isAutoLayout()) {\r\n this.fFlowComponent()?.reset();\r\n }\r\n this.updateGraph(graph, direction);\r\n this.applyGraphPositions(graph);\r\n }\r\n\r\n private updateGraph(graph: Graph, direction: Direction): void {\r\n this.configuration.set(CONFIGURATION[Direction.TOP_TO_BOTTOM]);\r\n graph.setGraph({ rankdir: direction });\r\n\r\n const SIZE = { width: 300, height: 200 };\r\n this.nodes().forEach((n) => {\r\n graph.setNode(n[this.fields().id], {\r\n width: SIZE.width,\r\n height: SIZE.height,\r\n });\r\n });\r\n\r\n this.connectionsComputed().forEach((c) => {\r\n const fromId = c.from;\r\n const toId = c.to;\r\n if (fromId && toId && fromId !== toId) {\r\n graph.setEdge(fromId, toId, {});\r\n }\r\n });\r\n\r\n dagre.layout(graph);\r\n }\r\n\r\n private applyGraphPositions(graph: Graph): void {\r\n const positionsById: Record<string, IPoint> = {};\r\n graph.nodes().forEach((key) => {\r\n const gNode = graph.node(key);\r\n positionsById[key] = { x: gNode.x, y: gNode.y };\r\n });\r\n this.positions.update((old) => ({ ...old, ...positionsById }));\r\n }\r\n\r\n private getNestedValue(obj: unknown, path?: string | null): unknown {\r\n if (!path) return undefined;\r\n const keys = path\r\n .replace(/\\[(\\w+)\\]/g, '.$1')\r\n .replace(/^\\./, '')\r\n .split('.')\r\n .filter(Boolean);\r\n\r\n return keys.reduce<unknown>(\r\n (acc, k) => (acc == null ? undefined : (acc as any)[k]),\r\n obj,\r\n );\r\n }\r\n\r\n maybeAutoLayout(): void {\r\n if (!this.isAutoLayout() || this.nodes().length === 0) return;\r\n this.getData(new dagre.graphlib.Graph(), this.direction());\r\n }\r\n\r\n private generateConnectionId(): string {\r\n return `conn-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private extractNodeId(connectionEndId: string): string {\r\n return (connectionEndId || '').replace(/-(in|out)$/, '');\r\n }\r\n}\r\n","<!-- structure-builder.html -->\r\n@if (availableTabs().length > 0) {\r\n <mt-card\r\n class=\"absolute ms-4 mt-4 z-1 h-[calc(100%---spacing(8))] w-1/5 min-w-xs\"\r\n >\r\n <ng-template #headless>\r\n <!-- Header -->\r\n <div class=\"flex items-center justify-between px-4 pt-5\">\r\n <h3 class=\"text-xl font-semibold\">\r\n {{ \"structureBuilder.levelTemplates\" | transloco }}\r\n </h3>\r\n </div>\r\n\r\n <!-- Tabs using PrimeNG -->\r\n <p-tabs\r\n [(value)]=\"activeTab\"\r\n styleClass=\"structure-tabs \"\r\n class=\"h-full overflow-hidden\"\r\n >\r\n <p-tablist>\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tab [value]=\"i.toString()\">{{ tab | titlecase }}</p-tab>\r\n }\r\n </p-tablist>\r\n <p-tabpanels class=\"bg-transparent! p-0! overflow-auto\">\r\n @for (tab of availableTabs(); track tab; let i = $index) {\r\n <p-tabpanel [value]=\"i.toString()\">\r\n <p class=\"text-xs text-muted py-3 px-4\">\r\n {{ \"structureBuilder.dragToAdd\" | transloco }}\r\n </p>\r\n\r\n <!-- Node List -->\r\n <div class=\"space-y-1 px-4\">\r\n @for (node of currentTabNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move transition-colors\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{\r\n node.label\r\n }}</span>\r\n </div>\r\n }\r\n\r\n @if (currentTabNodes().length === 0) {\r\n <div class=\"text-center py-8 text-gray-400\">\r\n <p class=\"text-sm\">\r\n {{\r\n \"structureBuilder.allItemsInUse\"\r\n | transloco: { tab: tab }\r\n }}\r\n </p>\r\n </div>\r\n }\r\n </div>\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n </ng-template>\r\n </mt-card>\r\n} @else if (availableNodes().length > 0) {\r\n <mt-card\r\n [title]=\"'structureBuilder.steps' | transloco\"\r\n class=\"absolute top-4 start-4 z-1 w-64\"\r\n >\r\n <div class=\"flex flex-col gap-2\">\r\n @for (node of availableNodes(); track node.id) {\r\n <div\r\n fExternalItem\r\n [fData]=\"node\"\r\n class=\"group select-none relative flex items-center gap-3 py-3 px-4 hover:bg-emphasis hover:border-solid transition-colors rounded-lg border-1 border-dashed border-color border-surface-300 dark:border-surface-500 cursor-move bg-content\"\r\n >\r\n <!-- Node Icon with color -->\r\n <div class=\"text-primary text-lg\">\r\n <mt-icon [icon]=\"node.icon || 'general.box'\"></mt-icon>\r\n </div>\r\n\r\n <!-- Node Name -->\r\n <span class=\"text-base font-medium flex-1\">{{ node.label }}</span>\r\n </div>\r\n }\r\n </div>\r\n </mt-card>\r\n}\r\n<!-- Left Sidebar -->\r\n\r\n<!-- Main Canvas Area -->\r\n<div class=\"flex-1 z-0 relative\">\r\n <ng-content select=\"[flowContent]\"></ng-content>\r\n\r\n <f-flow\r\n fDraggable\r\n (fLoaded)=\"onLoaded()\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n class=\"size-full\"\r\n >\r\n <f-background>\r\n <f-circle-pattern color=\"#b5b5b5\"></f-circle-pattern>\r\n </f-background>\r\n <f-canvas fZoom [fZoomMinimum]=\"0.1\" [fZoomMaximum]=\"2\">\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"straight\">\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-connection-for-create>\r\n <f-snap-connection\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n class=\"z-1\"\r\n [fSnapThreshold]=\"100\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n </f-snap-connection>\r\n\r\n <f-connection-for-create></f-connection-for-create>\r\n\r\n <!-- Enhanced Connections with Edit Button -->\r\n @for (connection of connectionsComputed(); track connection.id) {\r\n <f-connection\r\n [fReassignDisabled]=\"true\"\r\n [fOutputId]=\"connection.from\"\r\n [fInputId]=\"connection.to\"\r\n fBehavior=\"fixed\"\r\n fType=\"segment\"\r\n [ngClass]=\"{ 'connection-loading': connection.loading, 'z-1': true }\"\r\n >\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_START\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <svg\r\n viewBox=\"0 0 12 12\"\r\n fMarker\r\n [type]=\"eMarkerType.SELECTED_END\"\r\n [height]=\"12\"\r\n [width]=\"12\"\r\n [refX]=\"6\"\r\n [refY]=\"6\"\r\n >\r\n <circle\r\n cx=\"6\"\r\n cy=\"6\"\r\n r=\"3\"\r\n stroke=\"none\"\r\n fill=\"currentColor\"\r\n ></circle>\r\n </svg>\r\n <div\r\n fConnectionCenter\r\n class=\"flex items-center gap-1 bg-content rounded-md p-1 shadow-sm\"\r\n >\r\n @if (!connection.loading) {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.edit-05'\"\r\n (click)=\"openConnectionDialog(connection)\"\r\n >\r\n </mt-button>\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n severity=\"danger\"\r\n [icon]=\"'general.trash-01'\"\r\n (click)=\"removeConnection(connection)\"\r\n >\r\n </mt-button>\r\n } @else {\r\n <mt-button\r\n size=\"small\"\r\n variant=\"text\"\r\n [icon]=\"'general.loading-01'\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </f-connection>\r\n }\r\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n <mt-card\r\n fNode\r\n fDragHandle\r\n [fNodePosition]=\"{\r\n x: node.configuration?.x || 200,\r\n y: node.configuration?.y || 100,\r\n }\"\r\n (fNodePositionChange)=\"onNodePositionChange($event, node._computedId)\"\r\n [style.--node-data-border-color]=\"node._computedColor\"\r\n >\r\n <ng-template #headless>\r\n @if (!node.loading) {\r\n <div\r\n class=\"flex flex-col items-center min-w-3xs gap-2 px-3 py-4 rounded-t-2xl bg-white dark:bg-surface-800 border-(--p-content-border-color)\"\r\n >\r\n @if (node._computedIcon) {\r\n <mt-icon\r\n class=\"text-2xl text-primary\"\r\n [icon]=\"node._computedIcon\"\r\n />\r\n }\r\n <div>{{ node._computedName }}</div>\r\n </div>\r\n <div\r\n class=\"flex justify-center pt-3 mb-4 gap-2 bg-surface-50 dark:bg-surface-900\"\r\n >\r\n @for (\r\n action of nodeActions() | filterActions: node;\r\n track action.key\r\n ) {\r\n <mt-button\r\n [size]=\"action?.size || 'small'\"\r\n [variant]=\"action?.variant\"\r\n [icon]=\"action?.icon\"\r\n [tooltip]=\"action?.tooltip\"\r\n [severity]=\"action?.severity\"\r\n (onClick)=\"buttonAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n fInputConnectableSide=\"top\"\r\n [fInputMultiple]=\"true\"\r\n class=\"top\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n fOutputConnectableSide=\"bottom\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n class=\"bottom bg-surface-50 dark:bg-surface-900\"\r\n ></div>\r\n } @else {\r\n <p-skeleton height=\"10rem\" width=\"15rem\" />\r\n }\r\n\r\n <!-- Node Header with Edit Button -->\r\n </ng-template>\r\n </mt-card>\r\n }\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n<mt-toolbar />\r\n","/*\r\n * Public API Surface of structure-builder\r\n */\r\n\r\nexport * from './lib/structure-builder';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;MA8Ba,uBAAuB,CAAA;AACzB,IAAA,YAAY,GAAiB,MAAM,CAAC,YAAY,CAAC;AAC1D,IAAA,GAAG,GAAa,MAAM,CAAC,QAAQ,CAAC;;IAEvB,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACxE,IAAA,kBAAkB,GAAG,IAAI,WAAW,EAAE;AACtC,IAAA,QAAQ;AACR,IAAA,UAAU;AACV,IAAA,IAAI,GAAG,KAAK,CAAM,IAAI,gDAAC;IAEvB,QAAQ,GAAA;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE;QACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,IAAI,EAAE;IACjD;IACA,eAAe,GAAA;QACb,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;IACjD;AACA,IAAA,IAAI,eAAe,GAAA;QACjB,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,QAAQ;AACnB,YAAA,IAAI,EAAE,CAAC,IAAA,GAAY,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAC3C,YAAA,MAAM,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;AAC7B,YAAA,KAAK,EAAE,MAAM,IAAI,CAAC,QAAQ,EAAE;YAC5B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;SACxC;IACH;IACA,MAAM,CAAC,OAAY,EAAE,EAAA;AACnB,QAAA,MAAM,WAAW,GAAG;YAClB,GAAG,IAAI,CAAC,QAAQ;AAChB,YAAA,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;AAChC,YAAA,GAAG,IAAI;SACR;AACD,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;IAC7B;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;IAClB;uGArCW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAvB,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC9BpC,20BA6BA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDRI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAKN,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAbnC,SAAS;+BACE,qBAAqB,EAAA,UAAA,EACnB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,MAAM;wBACN,mBAAmB;wBACnB,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,20BAAA,EAAA;;;MEJU,6BAA6B,CAAA;AAC/B,IAAA,YAAY,GAAiB,MAAM,CAAC,YAAY,CAAC;AAClD,IAAA,GAAG,GAAa,MAAM,CAAC,QAAQ,CAAC;AACxC,IAAA,IAAI,GAAG,KAAK,CAAM,IAAI,gDAAC;AACvB,IAAA,kBAAkB,GAAG,IAAI,WAAW,EAAE;AACtC,IAAA,cAAc;AACd,IAAA,UAAU;IAEV,QAAQ,GAAA;QACN,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,IAAI,EAAE;QACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,UAAU,IAAI,EAAE;IACjD;IACA,eAAe,GAAA;QACb,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;IACvD;IAEA,MAAM,GAAA;AACJ,QAAA,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE;AACjC,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;gBACb,GAAG,IAAI,CAAC,cAAc;AACtB,gBAAA,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK;AACjC,aAAA,CAAC;QACJ;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;IAClB;uGA3BW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB1C,6rBAwBA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDXI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,WAAW,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACX,MAAM,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACN,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAKN,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAbzC,SAAS;+BACE,2BAA2B,EAAA,UAAA,EACzB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,MAAM;wBACN,mBAAmB;wBACnB,eAAe;AAChB,qBAAA,EAAA,QAAA,EAAA,6rBAAA,EAAA;;;MEAU,OAAO,CAAA;IACT,IAAI,GAAG,KAAK,CAAA,IAAA,SAAA,GAAA,CAAA,SAAA,EAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAiC;AAE9C,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAE5C,QAAQ,GAAA;QACb,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE;IAClD;IAEO,SAAS,GAAA;QACd,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE;IACnD;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC;AACF,aAAA,gBAAgB;AACjB,cAAE,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAC7D;IAEO,UAAU,GAAA;QACf,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,EAAE,mBAAmB,EAAE;IACjE;IACO,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,eAAe,EAAE;IACzC;uGAxBW,OAAO,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,OAAO,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EClBpB,42BAgCA,EAAA,MAAA,EAAA,CAAA,4LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDnBY,MAAM,4VAAE,WAAW,EAAA,QAAA,EAAA,iDAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAKlB,OAAO,EAAA,UAAA,EAAA,CAAA;kBAPnB,SAAS;+BACE,YAAY,EAAA,OAAA,EACb,CAAC,MAAM,EAAE,WAAW,CAAC,EAAA,eAAA,EACb,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,42BAAA,EAAA,MAAA,EAAA,CAAA,4LAAA,CAAA,EAAA;;;MENpC,iBAAiB,CAAA;IAC5B,SAAS,CAAC,OAAkB,EAAE,IAAS,EAAA;QACrC,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;AACvC,YAAA,OAAO,EAAE;QACX;AAEA,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;;AAE/B,YAAA,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;AACrB,gBAAA,OAAO,IAAI;YACb;;AAGA,YAAA,OAAO,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC;AAC/B,QAAA,CAAC,CAAC;IACJ;uGAfW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA;qGAAjB,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,eAAA,EAAA,CAAA;;2FAAjB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAL7B,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,eAAe;AACrB,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE,IAAI;AACX,iBAAA;;;AC+GD;AACA,IAAK,SAGJ;AAHD,CAAA,UAAK,SAAS,EAAA;AACZ,IAAA,SAAA,CAAA,eAAA,CAAA,GAAA,IAAoB;AACpB,IAAA,SAAA,CAAA,eAAA,CAAA,GAAA,IAAoB;AACtB,CAAC,EAHI,SAAS,KAAT,SAAS,GAAA,EAAA,CAAA,CAAA;AAKd,MAAM,aAAa,GAAG;AACpB,IAAA,CAAC,SAAS,CAAC,aAAa,GAAG;;AAEzB,QAAA,UAAU,EAAE,OAAO;AACnB,QAAA,SAAS,EAAE,MAAM;AAClB,KAAA;AACD,IAAA,CAAC,SAAS,CAAC,aAAa,GAAG;AACzB,QAAA,UAAU,EAAE,QAAQ;AACpB,QAAA,SAAS,EAAE,KAAK;AACjB,KAAA;CACO;MA0BG,gBAAgB,CAAA;AAClB,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AACrC,IAAA,KAAK,GAAiB,MAAM,CAAC,YAAY,CAAC;AAC3C,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAC5C,gBAAgB,GAAG,MAAM,EAAmB;IAC5C,MAAM,GAAG,MAAM,EAAY;AAC3B,IAAA,cAAc,GAAG,KAAK,CAAkB,EAAE,0DAAC;AACjC,IAAA,OAAO,GAAG,SAAS,CAAC,gBAAgB,mDAAC;AACxC,IAAA,cAAc,GAAG,SAAS,CAAC,cAAc,0DAAC;AAC1C,IAAA,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,4DAAC;AAC9C,IAAA,cAAc,GAAG,SAAS,CAAC,cAAc,0DAAC;IACjD,QAAQ,GAAG,KAAK,CAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,UAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;IACrD,cAAc,GAAG,KAAK,CAAoB,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC3D,IAAA,WAAW,GAAG,KAAK,CAAY,EAAE,uDAAC;IAClC,UAAU,GAAG,KAAK,CAAoB;AACpC,QAAA,EAAE,EAAE,IAAI;AACR,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,KAAK,EAAE,OAAO;AACf,KAAA,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,YAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAEF,IAAA,YAAY,GAAG,KAAK,CAAU,IAAI,wDAAC;AACnC,IAAA,YAAY,GAAG,KAAK,CAAsB,QAAQ,wDAAC;AACnD,IAAA,eAAe,GAAG,KAAK,CAAsB,QAAQ,2DAAC;AACtD,IAAA,kBAAkB,GAAG,KAAK,CAAS,YAAY,8DAAC;AAChD,IAAA,qBAAqB,GAAG,KAAK,CAAS,YAAY,iEAAC;AACnD,IAAA,cAAc,GAAG,KAAK,CAAS,UAAU,0DAAC;AAC1C,IAAA,iBAAiB,GAAG,KAAK,CAAS,sBAAsB,6DAAC;AACzD,IAAA,QAAQ,GAAG,KAAK,CAAS,EAAE,oDAAC;AAC5B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AACzB,IAAA,WAAW,GAAG,KAAK,CAAe,EAAE,uDAAC;AACrC,IAAA,kBAAkB,GAAG,YAAY,CAAmB,YAAY,8DAAC;AAEjE,IAAA,SAAS,GAAG,MAAM,CAAC,GAAG,qDAAC;IACJ,WAAW,GAAG,YAAY;IAEnC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,eAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAC9D,IAAA,SAAS,GAAG,MAAM,CAAY,SAAS,CAAC,aAAa,qDAAC;AAExD,IAAA,SAAS,GAAG,MAAM,CAAyB,EAAE,qDAAC;AAC9C,IAAA,SAAS;AACP,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE;QACrC,OAAO;AACL,YAAA,EAAE,EAAE,WAAW,CAAC,EAAE,IAAI,IAAI;AAC1B,YAAA,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,MAAM;AAChC,YAAA,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,MAAM;AAChC,YAAA,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,OAAO;SAC7B;AACV,IAAA,CAAC,kDAAC;AAEF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AAC5B,QAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU;QACjC,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;AACrC,YAAA,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;AACvC,gBAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC7C;AACF,QAAA,CAAC,CAAC;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;AACnC,IAAA,CAAC,yDAAC;AAEF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAK;AAC9B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;QACjC,MAAM,eAAe,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AAClD,QAAA,IAAI,eAAe,IAAI,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;AAC7C,QAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC;QACxC,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,KACvC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,CAC9B;AACH,IAAA,CAAC,2DAAC;AAEF,IAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE;QAC5B,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAI;AAC/B,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAChE,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AAC5D,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AAC5D,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC;YAC9D,MAAM,EAAE,GAAG,WAAW;AACtB,YAAA,MAAM,aAAa,GAAG;AACpB,gBAAA,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;AAC7B,gBAAA,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;aACnB;YACD,OAAO;AACL,gBAAA,GAAG,IAAI;gBACP,WAAW;gBACX,aAAa;gBACb,aAAa;gBACb,cAAc;gBACd,aAAa;aACd;AACH,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,kEAAC;AACF,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAC7B,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,MAAM;AAC9B,QAAA,GAAG,CAAC;AACJ,QAAA,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACpB,QAAA,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;KACjB,CAAC,CAAC,+DACJ;AACD,IAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACzB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,OAAO,IAAI,GAAG,CAAC;AACb,YAAA,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACxB,eAAe;YACf,aAAa;YACb,eAAe;YACf,eAAe;YACf,gBAAgB;AACjB,SAAA,CAAC;AACJ,IAAA,CAAC,sDAAC;AAEF,IAAA,WAAA,GAAA,EAAe;IAER,QAAQ,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5D;IAEU,QAAQ,GAAA;QAChB,IAAI,CAAC,WAAW,EAAE;IACpB;AAEA,IAAA,YAAY,CAAC,KAAuB,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAqB;AAC5C,QAAA,IAAI,CAAC,QAAQ;YAAE;AAEf,QAAA,MAAM,OAAO,GAAS;AACpB,YAAA,GAAG,QAAQ;AACX,YAAA,aAAa,EAAE;AACb,gBAAA,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AACf,gBAAA,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAChB,aAAA;SACF;AAED,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;AACrE,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC;QACpC;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3D;IACF;IAEA,oBAAoB,CAAC,KAAU,EAAE,MAAc,EAAA;QAC7C,MAAM,QAAQ,GAAG,KAAK;AACtB,QAAA,IAAI,MAAM,IAAI,QAAQ,EAAE;YACtB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;AAC5B,gBAAA,GAAG,CAAC;AACJ,gBAAA,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE;AAC3C,aAAA,CAAC,CAAC;QACL;IACF;AAEA,IAAA,kBAAkB,CAAC,KAA6B,EAAA;AAC9C,QAAA,MAAM,aAAa,GAAe;AAChC,YAAA,EAAE,EAAE,IAAI,CAAC,oBAAoB,EAAE;YAC/B,IAAI,EAAE,KAAK,CAAC,SAAU;YACtB,EAAE,EAAE,KAAK,CAAC,QAAS;SACpB;QACD,IAAI,CAAC,KAAK,CAAC,QAAS,IAAI,CAAC,KAAK,CAAC,SAAU,EAAE;YACzC;QACF;AACA,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAC5C,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,aAAa,CAAC,EAAE,CACnE;QAED,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;QACvE;IACF;AAEA,IAAA,cAAc,CAAC,IAAU,EAAE,SAAA,GAAqB,KAAK,EAAA;AACnD,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAClB,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;QACxB;AACA,QAAA,MAAM,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;AAC1E,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;YACf,MAAM,EAAE,SAAS,GAAG,eAAe,GAAG,eAAe;AACrD,YAAA,IAAI,EAAE,IAAI;AACX,SAAA,CAAC;QAEF,MAAM,UAAU,GAAG;AACjB,cAAE,IAAI,CAAC,kBAAkB;AACzB,cAAE,IAAI,CAAC,qBAAqB,EAAE;AAChC,QAAA,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAE3E,QAAA,MAAM,MAAM,GAAG;AACb,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,UAAU,EAAE,UAAU;AACtB,YAAA,WAAW,EAAE,IAAI,CAAC,kBAAkB,EAAE,GAAG,KAAK,GAAG,IAAI;AACrD,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,QAAQ,EAAE,SAAS,KAAK,QAAQ,GAAG,KAAK,GAAG,SAAS;AACpD,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,KAAK,EAAE,IAAI;AAEX,YAAA,WAAW,EAAE;AACX,gBAAA,IAAI,EAAE;AACJ,oBAAA,IAAI,EAAE,IAAI;AACV,oBAAA,UAAU,EAAE,IAAI,CAAC,QAAQ,EAAE;AAC3B,oBAAA,QAAQ,EAAE,IAAI,CAAC,kBAAkB,EAAE;AACpC,iBAAA;AACF,aAAA;SACF;AACD,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CACnC,uBAAuB,EACvB,SAAS,EACT,MAAM,CACP;QAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;YAC/C,IAAI,MAAM,EAAE;gBACV,IAAI,SAAS,EAAE;oBACb,MAAM,mBAAmB,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,EAAE;AAClD,oBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;gBACvE;qBAAO;AACL,oBAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAC/B;YACF;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,oBAAoB,CAAC,UAAsB,EAAA;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,6BAA6B,EAAE,QAAQ,EAAE;YACxE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAC9B,2CAA2C,CAC5C;AACD,YAAA,KAAK,EAAE,OAAO;AAEd,YAAA,WAAW,EAAE;AACX,gBAAA,IAAI,EAAE;AACJ,oBAAA,UAAU,EAAE,UAAU;AACtB,oBAAA,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE;AAClC,iBAAA;AACF,aAAA;AACF,SAAA,CAAC;QAEF,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,MAAW,KAAI;YACpC,IAAI,MAAM,EAAE;AACV,gBAAA,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC;YACrC;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,gBAAgB,CAAC,QAAa,EAAA;QAC5B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACzC,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5D;IACF;AAEA,IAAA,sBAAsB,CAAC,QAAa,EAAA;AAClC,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,EAAE;QAChC,IAAI,YAAY,EAAE;AAChB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAClE;IACF;AAEA,IAAA,UAAU,CAAC,IAAS,EAAA;AAClB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxD;AAEA,IAAA,gBAAgB,CAAC,UAAe,EAAA;AAC9B,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IACpE;IAEA,YAAY,CAAC,MAAW,EAAE,IAAS,EAAA;QACjC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC5C,QAAA,IAAI,MAAM,CAAC,GAAG,KAAK,MAAM,EAAE;AACzB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC;QAC3B;AAAO,aAAA,IAAI,MAAM,CAAC,GAAG,KAAK,QAAQ,EAAE;AAClC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACvB;IACF;IAEU,WAAW,GAAA;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,GAAG,EAAE;AACtC,QAAA,IAAI,CAAC,gBAAgB,EAAE,EAAE,WAAW,CAClC,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,EACtC,KAAK,CACN;IACH;IAEQ,OAAO,CAAC,KAAY,EAAE,SAAoB,EAAA;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;AAC7B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE;QAChC;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC;AAClC,QAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;IACjC;IAEQ,WAAW,CAAC,KAAY,EAAE,SAAoB,EAAA;AACpD,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9D,KAAK,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAEtC,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;QACxC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACzB,YAAA,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE;gBACjC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;AACpB,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,IAAI,CAAC,mBAAmB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AACvC,YAAA,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI;AACrB,YAAA,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE;YACjB,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE;gBACrC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IACrB;AAEQ,IAAA,mBAAmB,CAAC,KAAY,EAAA;QACtC,MAAM,aAAa,GAA2B,EAAE;QAChD,KAAK,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,KAAI;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;AAC7B,YAAA,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;AACjD,QAAA,CAAC,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,aAAa,EAAE,CAAC,CAAC;IAChE;IAEQ,cAAc,CAAC,GAAY,EAAE,IAAoB,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,SAAS;QAC3B,MAAM,IAAI,GAAG;AACV,aAAA,OAAO,CAAC,YAAY,EAAE,KAAK;AAC3B,aAAA,OAAO,CAAC,KAAK,EAAE,EAAE;aACjB,KAAK,CAAC,GAAG;aACT,MAAM,CAAC,OAAO,CAAC;AAElB,QAAA,OAAO,IAAI,CAAC,MAAM,CAChB,CAAC,GAAG,EAAE,CAAC,MAAM,GAAG,IAAI,IAAI,GAAG,SAAS,GAAI,GAAW,CAAC,CAAC,CAAC,CAAC,EACvD,GAAG,CACJ;IACH;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,KAAK,CAAC;YAAE;AACvD,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5D;IAEQ,oBAAoB,GAAA;QAC1B,OAAO,CAAA,KAAA,EAAQ,IAAI,CAAC,GAAG,EAAE,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA,CAAE;IACxE;AAEQ,IAAA,aAAa,CAAC,eAAuB,EAAA;AAC3C,QAAA,OAAO,CAAC,eAAe,IAAI,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;IAC1D;uGA7VW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,QAAA,EAAA,KAAA,EAAA,aAAA,EAAA,WAAA,EAAA,mBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,qFAAA,EAAA,EAAA,SAAA,EANhB,CAAC,aAAa,CAAC,iMAcI,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACZ,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EACZ,gBAAgB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAClB,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC3KlD,gxYAkXA,ghODtOI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,IAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,WAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,6BAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,QAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,wBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,gBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,mBAAA,EAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,cAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,eAAA,EAAA,eAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,qBAAA,EAAA,iBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,0BAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,kBAAA,EAAA,iCAAA,EAAA,aAAA,EAAA,YAAA,EAAA,qBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,UAAU,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,IAAA,CAAA,IAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,YAAA,EAAA,MAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,SAAA,EAAA,QAAA,EAAA,aAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,QAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACV,MAAM,4VACN,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,IAAI,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,OAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,OAAO,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACP,QAAQ,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,OAAA,EAAA,WAAA,EAAA,cAAA,EAAA,MAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAER,eAAe,uFADf,iBAAiB,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAWR,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAxB5B,SAAS;+BACE,sBAAsB,EAAA,UAAA,EACpB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,WAAW;wBACX,WAAW;wBACX,UAAU;wBACV,MAAM;wBACN,IAAI;wBACJ,IAAI;wBACJ,OAAO;wBACP,QAAQ;wBACR,iBAAiB;wBACjB,eAAe;qBAChB,EAAA,SAAA,EAGU,CAAC,aAAa,CAAC,EAAA,IAAA,EACpB;AACJ,wBAAA,KAAK,EACH,qFAAqF;AACxF,qBAAA,EAAA,QAAA,EAAA,gxYAAA,EAAA,MAAA,EAAA,CAAA,y9NAAA,CAAA,EAAA;AAU6B,SAAA,CAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,cAAA,EAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,IAAA,EAAA,CAAA,QAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAAA,gBAAgB,6FACZ,cAAc,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MACZ,gBAAgB,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,UAAA,CAAA,MAClB,cAAc,8mDAqBI,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEhMlE;;AAEG;;ACFH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/structure-builder",
3
- "version": "0.0.29",
3
+ "version": "0.0.31",
4
4
  "publishConfig": {
5
5
  "directory": "../../../dist/masterteam/structure-builder",
6
6
  "linkDirectory": false,
@@ -20,9 +20,9 @@
20
20
  "tailwindcss": "^4.1.17",
21
21
  "tailwindcss-primeui": "^0.6.1",
22
22
  "dagre": "^0.8.5",
23
- "@masterteam/components": "^0.0.68",
24
23
  "@masterteam/icons": "^0.0.12",
25
- "@masterteam/forms": "^0.0.31"
24
+ "@masterteam/components": "^0.0.76",
25
+ "@masterteam/forms": "^0.0.33"
26
26
  },
27
27
  "sideEffects": false,
28
28
  "exports": {