@masterteam/structure-builder 0.0.33 → 0.0.34

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/assets/sb.css CHANGED
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */
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}
1
+ /*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */
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{inset-inline-start:var(--spacing)}.start-4{inset-inline-start:calc(var(--spacing) * 4)}.end{inset-inline-end:var(--spacing)}.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}
@@ -60,7 +60,7 @@ class NodeFormDialogComponent {
60
60
  this.ref.close();
61
61
  }
62
62
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NodeFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
63
- 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" }] });
63
+ 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", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { 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" }] });
64
64
  }
65
65
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: NodeFormDialogComponent, decorators: [{
66
66
  type: Component,
@@ -99,7 +99,7 @@ class ConnectionFormDialogComponent {
99
99
  this.ref.close();
100
100
  }
101
101
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ConnectionFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
102
- 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" }] });
102
+ 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", "forcedHiddenFieldKeys", "preserveForcedHiddenValues", "visibleSectionKeys"], outputs: ["runtimeMessagesChange"] }, { 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" }] });
103
103
  }
104
104
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: ConnectionFormDialogComponent, decorators: [{
105
105
  type: Component,
@@ -210,6 +210,7 @@ class StructureBuilder {
210
210
  color: 'color',
211
211
  }, ...(ngDevMode ? [{ debugName: "nodeFields" }] : []));
212
212
  isAutoLayout = input(true, ...(ngDevMode ? [{ debugName: "isAutoLayout" }] : []));
213
+ readonly = input(false, ...(ngDevMode ? [{ debugName: "readonly" }] : []));
213
214
  addModalType = input('dialog', ...(ngDevMode ? [{ debugName: "addModalType" }] : []));
214
215
  updateModalType = input('drawer', ...(ngDevMode ? [{ debugName: "updateModalType" }] : []));
215
216
  addModalStyleClass = input('!w-[35rem]', ...(ngDevMode ? [{ debugName: "addModalStyleClass" }] : []));
@@ -330,6 +331,9 @@ class StructureBuilder {
330
331
  this.fitToScreen();
331
332
  }
332
333
  onCreateNode(event) {
334
+ if (this.readonly()) {
335
+ return;
336
+ }
333
337
  const nodeData = event.data;
334
338
  if (!nodeData)
335
339
  return;
@@ -357,6 +361,9 @@ class StructureBuilder {
357
361
  }
358
362
  }
359
363
  onCreateConnection(event) {
364
+ if (this.readonly()) {
365
+ return;
366
+ }
360
367
  const newConnection = {
361
368
  id: this.generateConnectionId(),
362
369
  from: event.fOutputId,
@@ -371,6 +378,9 @@ class StructureBuilder {
371
378
  }
372
379
  }
373
380
  openNodeDialog(node, isNewNode = false) {
381
+ if (this.readonly()) {
382
+ return;
383
+ }
374
384
  if (this.dialogRef) {
375
385
  this.dialogRef.close();
376
386
  }
@@ -413,6 +423,9 @@ class StructureBuilder {
413
423
  });
414
424
  }
415
425
  openConnectionDialog(connection) {
426
+ if (this.readonly()) {
427
+ return;
428
+ }
416
429
  const ref = this.modal.openModal(ConnectionFormDialogComponent, 'dialog', {
417
430
  header: this.transloco.translate('structureBuilder.editConnectionProperties'),
418
431
  width: '600px',
@@ -442,12 +455,21 @@ class StructureBuilder {
442
455
  }
443
456
  }
444
457
  removeNode(node) {
458
+ if (this.readonly()) {
459
+ return;
460
+ }
445
461
  this.action.emit({ action: 'deleteNode', data: node });
446
462
  }
447
463
  removeConnection(connection) {
464
+ if (this.readonly()) {
465
+ return;
466
+ }
448
467
  this.action.emit({ action: 'deleteConnection', data: connection });
449
468
  }
450
469
  buttonAction(action, node) {
470
+ if (this.readonly()) {
471
+ return;
472
+ }
451
473
  this.nodeActionsEvent.emit({ action, node });
452
474
  if (action.key === 'edit') {
453
475
  this.openNodeDialog(node);
@@ -562,7 +584,7 @@ class StructureBuilder {
562
584
  return visited;
563
585
  }
564
586
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: StructureBuilder, deps: [], target: i0.ɵɵFactoryTarget.Component });
565
- 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 }, availableTabsClass: { classPropertyName: "availableTabsClass", publicName: "availableTabsClass", isSignal: true, isRequired: false, transformFunction: null }, layoutDirection: { classPropertyName: "layoutDirection", publicName: "layoutDirection", 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 }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", 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 }, { propertyName: "nodeTemplateContent", first: true, predicate: ["nodeTemplate"], 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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @let filteredActions = nodeActions() | filterActions: node;\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\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}}::ng-deep f-flow{direction:ltr}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;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-input:not(.f-node).bottom,.f-node-output:not(.f-node).top,.f-node-output:not(.f-node).bottom{width:100%;height:16px;left:0}.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).left,.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).left,.f-node-output:not(.f-node).right{width:16px;height:100%;top:0}.f-node-input:not(.f-node).left,.f-node-output:not(.f-node).left{left:0;border-radius:1rem 0 0 1rem}.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).right{right:0;border-radius:0 1rem 1rem 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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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" }] });
587
+ 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 }, readonly: { classPropertyName: "readonly", publicName: "readonly", 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 }, availableTabsClass: { classPropertyName: "availableTabsClass", publicName: "availableTabsClass", isSignal: true, isRequired: false, transformFunction: null }, layoutDirection: { classPropertyName: "layoutDirection", publicName: "layoutDirection", 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 }, nodeTemplate: { classPropertyName: "nodeTemplate", publicName: "nodeTemplate", 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 }, { propertyName: "nodeTemplateContent", first: true, predicate: ["nodeTemplate"], 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 (!readonly() && availableTabs().length > 0) {\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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 (!readonly() && availableNodes().length > 0) {\n <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @if (!readonly()) {\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 }\n </f-connection>\n }\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n @let filteredActions = readonly() ? [] : (nodeActions() | filterActions: node);\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n@if (!readonly()) {\n <mt-toolbar />\n}\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}}::ng-deep f-flow{direction:ltr}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;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-input:not(.f-node).bottom,.f-node-output:not(.f-node).top,.f-node-output:not(.f-node).bottom{width:100%;height:16px;left:0}.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).left,.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).left,.f-node-output:not(.f-node).right{width:16px;height:100%;top:0}.f-node-input:not(.f-node).left,.f-node-output:not(.f-node).left{left:0;border-radius:1rem 0 0 1rem}.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).right{right:0;border-radius:0 1rem 1rem 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: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { 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" }] });
566
588
  }
567
589
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: StructureBuilder, decorators: [{
568
590
  type: Component,
@@ -580,8 +602,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
580
602
  TranslocoModule,
581
603
  ], providers: [DialogService], host: {
582
604
  class: 'flex h-full bg-surface-200 dark:bg-surface-700 relative rounded-2xl overflow-hidden',
583
- }, 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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @let filteredActions = nodeActions() | filterActions: node;\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\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}}::ng-deep f-flow{direction:ltr}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;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-input:not(.f-node).bottom,.f-node-output:not(.f-node).top,.f-node-output:not(.f-node).bottom{width:100%;height:16px;left:0}.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).left,.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).left,.f-node-output:not(.f-node).right{width:16px;height:100%;top:0}.f-node-input:not(.f-node).left,.f-node-output:not(.f-node).left{left:0;border-radius:1rem 0 0 1rem}.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).right{right:0;border-radius:0 1rem 1rem 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"] }]
584
- }], 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 }] }], availableTabsClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableTabsClass", required: false }] }], layoutDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "layoutDirection", 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 }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], nodeTemplateContent: [{ type: i0.ContentChild, args: ['nodeTemplate', { isSignal: true }] }] } });
605
+ }, template: "<!-- structure-builder.html -->\r\n@if (!readonly() && availableTabs().length > 0) {\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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 (!readonly() && availableNodes().length > 0) {\n <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @if (!readonly()) {\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 }\n </f-connection>\n }\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n @let filteredActions = readonly() ? [] : (nodeActions() | filterActions: node);\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n@if (!readonly()) {\n <mt-toolbar />\n}\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}}::ng-deep f-flow{direction:ltr}.f-node-input:not(.f-node),.f-node-output:not(.f-node){position:absolute;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-input:not(.f-node).bottom,.f-node-output:not(.f-node).top,.f-node-output:not(.f-node).bottom{width:100%;height:16px;left:0}.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).left,.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).left,.f-node-output:not(.f-node).right{width:16px;height:100%;top:0}.f-node-input:not(.f-node).left,.f-node-output:not(.f-node).left{left:0;border-radius:1rem 0 0 1rem}.f-node-input:not(.f-node).right,.f-node-output:not(.f-node).right{right:0;border-radius:0 1rem 1rem 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"] }]
606
+ }], 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 }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", 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 }] }], availableTabsClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "availableTabsClass", required: false }] }], layoutDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "layoutDirection", 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 }] }], nodeTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeTemplate", required: false }] }], nodeTemplateContent: [{ type: i0.ContentChild, args: ['nodeTemplate', { isSignal: true }] }] } });
585
607
 
586
608
  /*
587
609
  * Public API Surface of structure-builder
@@ -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';\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 effect,\r\n untracked,\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 { Directionality } from '@angular/cdk/bidi';\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 LayoutDirection = 'TB' | 'LR';\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 RIGHT_TO_LEFT = 'RL',\r\n TOP_TO_BOTTOM = 'TB',\r\n}\r\n\r\nconst CONFIGURATION = {\r\n [Direction.LEFT_TO_RIGHT]: {\r\n outputSide: 'right',\r\n inputSide: 'left',\r\n },\r\n [Direction.RIGHT_TO_LEFT]: {\r\n outputSide: 'left',\r\n inputSide: 'right',\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 {\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 private dir = inject(Directionality, { optional: true });\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 availableTabsClass = input<string>('');\r\n layoutDirection = input<LayoutDirection>(Direction.TOP_TO_BOTTOM);\r\n nodes = model<Node[]>([]);\r\n connections = model<Connection[]>([]);\r\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\r\n nodeTemplate = input<TemplateRef<any> | null>(null);\r\n nodeTemplateContent = contentChild<TemplateRef<any>>('nodeTemplate');\r\n protected readonly effectiveNodeTemplate = computed(\r\n () => this.nodeTemplate() || this.nodeTemplateContent() || null,\r\n );\r\n protected readonly contentDirection = computed(\r\n () => this.dir?.value ?? 'ltr',\r\n );\r\n private collapsedConnectionIds = signal<Set<string>>(new Set());\r\n\r\n activeTab = signal('0');\r\n protected readonly eMarkerType = EFMarkerType;\r\n\r\n protected readonly effectiveDirection = computed(() =>\r\n this.resolveDirection(this.layoutDirection()),\r\n );\r\n protected readonly configuration = computed(\r\n () => CONFIGURATION[this.effectiveDirection()],\r\n );\r\n protected readonly nodeActionHandler = (action: Actions, node: any): void => {\r\n this.buttonAction(action, node);\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 configuration = {\r\n ...(node.configuration ?? {}),\r\n ...(pos[_computedId] ?? {}),\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 effect(() => {\r\n const direction = this.effectiveDirection();\r\n untracked(() => {\r\n this.getData(new dagre.graphlib.Graph(), direction);\r\n });\r\n });\r\n effect(() => {\r\n const connectionIds = new Set(\r\n this.connectionsComputed().map((connection) => connection.id),\r\n );\r\n this.collapsedConnectionIds.update((current) => {\r\n if (current.size === 0) return current;\r\n let changed = false;\r\n const next = new Set<string>();\r\n current.forEach((id) => {\r\n if (connectionIds.has(id)) {\r\n next.add(id);\r\n } else {\r\n changed = true;\r\n }\r\n });\r\n return changed ? next : current;\r\n });\r\n });\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 toggleConnectionCollapse(connection: Connection): void {\r\n this.collapsedConnectionIds.update((current) => {\r\n const next = new Set(current);\r\n if (next.has(connection.id)) {\r\n next.delete(connection.id);\r\n } else {\r\n next.add(connection.id);\r\n }\r\n return next;\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 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 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.effectiveDirection());\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 private resolveDirection(layoutDirection: LayoutDirection): Direction {\r\n if (layoutDirection === Direction.LEFT_TO_RIGHT) {\r\n return this.dir?.value === 'rtl'\r\n ? Direction.RIGHT_TO_LEFT\r\n : Direction.LEFT_TO_RIGHT;\r\n }\r\n return Direction.TOP_TO_BOTTOM;\r\n }\r\n\r\n private buildAdjacency(connections: Connection[]): Map<string, string[]> {\r\n const adjacency = new Map<string, string[]>();\r\n connections.forEach((connection) => {\r\n if (!connection.from || !connection.to) return;\r\n const children = adjacency.get(connection.from) ?? [];\r\n children.push(connection.to);\r\n adjacency.set(connection.from, children);\r\n });\r\n return adjacency;\r\n }\r\n\r\n private getDescendants(\r\n startId: string,\r\n adjacency: Map<string, string[]>,\r\n ): Set<string> {\r\n const visited = new Set<string>();\r\n const stack = [startId];\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!current || visited.has(current)) {\r\n continue;\r\n }\r\n visited.add(current);\r\n const children = adjacency.get(current);\r\n if (children) {\r\n children.forEach((child) => stack.push(child));\r\n }\r\n }\r\n return visited;\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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @let filteredActions = nodeActions() | filterActions: node;\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\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":"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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 effect,\r\n untracked,\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 { Directionality } from '@angular/cdk/bidi';\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 LayoutDirection = 'TB' | 'LR';\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 RIGHT_TO_LEFT = 'RL',\r\n TOP_TO_BOTTOM = 'TB',\r\n}\r\n\r\nconst CONFIGURATION = {\r\n [Direction.LEFT_TO_RIGHT]: {\r\n outputSide: 'right',\r\n inputSide: 'left',\r\n },\r\n [Direction.RIGHT_TO_LEFT]: {\r\n outputSide: 'left',\r\n inputSide: 'right',\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 {\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 private dir = inject(Directionality, { optional: true });\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);\n readonly = input<boolean>(false);\n addModalType = input<'drawer' | 'dialog'>('dialog');\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 availableTabsClass = input<string>('');\r\n layoutDirection = input<LayoutDirection>(Direction.TOP_TO_BOTTOM);\r\n nodes = model<Node[]>([]);\r\n connections = model<Connection[]>([]);\r\n nodeDialogTemplate = contentChild<TemplateRef<any>>('nodeDialog');\r\n nodeTemplate = input<TemplateRef<any> | null>(null);\r\n nodeTemplateContent = contentChild<TemplateRef<any>>('nodeTemplate');\r\n protected readonly effectiveNodeTemplate = computed(\r\n () => this.nodeTemplate() || this.nodeTemplateContent() || null,\r\n );\r\n protected readonly contentDirection = computed(\r\n () => this.dir?.value ?? 'ltr',\r\n );\r\n private collapsedConnectionIds = signal<Set<string>>(new Set());\r\n\r\n activeTab = signal('0');\r\n protected readonly eMarkerType = EFMarkerType;\r\n\r\n protected readonly effectiveDirection = computed(() =>\r\n this.resolveDirection(this.layoutDirection()),\r\n );\r\n protected readonly configuration = computed(\r\n () => CONFIGURATION[this.effectiveDirection()],\r\n );\r\n protected readonly nodeActionHandler = (action: Actions, node: any): void => {\r\n this.buttonAction(action, node);\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 configuration = {\r\n ...(node.configuration ?? {}),\r\n ...(pos[_computedId] ?? {}),\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 effect(() => {\r\n const direction = this.effectiveDirection();\r\n untracked(() => {\r\n this.getData(new dagre.graphlib.Graph(), direction);\r\n });\r\n });\r\n effect(() => {\r\n const connectionIds = new Set(\r\n this.connectionsComputed().map((connection) => connection.id),\r\n );\r\n this.collapsedConnectionIds.update((current) => {\r\n if (current.size === 0) return current;\r\n let changed = false;\r\n const next = new Set<string>();\r\n current.forEach((id) => {\r\n if (connectionIds.has(id)) {\r\n next.add(id);\r\n } else {\r\n changed = true;\r\n }\r\n });\r\n return changed ? next : current;\r\n });\r\n });\r\n }\r\n\r\n protected onLoaded(): void {\r\n this.fitToScreen();\r\n }\r\n\r\n onCreateNode(event: FCreateNodeEvent): void {\n if (this.readonly()) {\n return;\n }\n\n const nodeData = event.data as AvailableNode;\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 {\n if (this.readonly()) {\n return;\n }\n\n const newConnection: Connection = {\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 {\n if (this.readonly()) {\n return;\n }\n\n if (this.dialogRef) {\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 {\n if (this.readonly()) {\n return;\n }\n\n const ref = this.modal.openModal(ConnectionFormDialogComponent, 'dialog', {\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 {\n if (this.readonly()) {\n return;\n }\n\n this.action.emit({ action: 'deleteNode', data: node });\n }\n\n removeConnection(connection: any): void {\n if (this.readonly()) {\n return;\n }\n\n this.action.emit({ action: 'deleteConnection', data: connection });\n }\n\n buttonAction(action: any, node: any) {\n if (this.readonly()) {\n return;\n }\n\n this.nodeActionsEvent.emit({ action, node });\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 toggleConnectionCollapse(connection: Connection): void {\r\n this.collapsedConnectionIds.update((current) => {\r\n const next = new Set(current);\r\n if (next.has(connection.id)) {\r\n next.delete(connection.id);\r\n } else {\r\n next.add(connection.id);\r\n }\r\n return next;\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 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 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.effectiveDirection());\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 private resolveDirection(layoutDirection: LayoutDirection): Direction {\r\n if (layoutDirection === Direction.LEFT_TO_RIGHT) {\r\n return this.dir?.value === 'rtl'\r\n ? Direction.RIGHT_TO_LEFT\r\n : Direction.LEFT_TO_RIGHT;\r\n }\r\n return Direction.TOP_TO_BOTTOM;\r\n }\r\n\r\n private buildAdjacency(connections: Connection[]): Map<string, string[]> {\r\n const adjacency = new Map<string, string[]>();\r\n connections.forEach((connection) => {\r\n if (!connection.from || !connection.to) return;\r\n const children = adjacency.get(connection.from) ?? [];\r\n children.push(connection.to);\r\n adjacency.set(connection.from, children);\r\n });\r\n return adjacency;\r\n }\r\n\r\n private getDescendants(\r\n startId: string,\r\n adjacency: Map<string, string[]>,\r\n ): Set<string> {\r\n const visited = new Set<string>();\r\n const stack = [startId];\r\n while (stack.length > 0) {\r\n const current = stack.pop();\r\n if (!current || visited.has(current)) {\r\n continue;\r\n }\r\n visited.add(current);\r\n const children = adjacency.get(current);\r\n if (children) {\r\n children.forEach((child) => stack.push(child));\r\n }\r\n }\r\n return visited;\r\n }\r\n}\r\n","<!-- structure-builder.html -->\r\n@if (!readonly() && availableTabs().length > 0) {\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 <mt-icon class=\"text-lg\" icon=\"general.menu-05\"></mt-icon>\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 (!readonly() && availableNodes().length > 0) {\n <div [ngClass]=\"availableTabsClass() || 'absolute top-4 start-4 z-1 w-64'\">\r\n <mt-card [title]=\"'structureBuilder.steps' | transloco\">\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 </div>\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 dir=\"ltr\"\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 @if (!readonly()) {\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 }\n </f-connection>\n }\n\r\n <!-- Enhanced Nodes with Edit Button -->\r\n @for (node of nodesWithComputedProps(); track node._computedId) {\r\n @let filteredActions = readonly() ? [] : (nodeActions() | filterActions: node);\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 [attr.dir]=\"contentDirection()\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"\r\n effectiveNodeTemplate() || defaultNodeTemplate\r\n \"\r\n [ngTemplateOutletContext]=\"{\r\n $implicit: node,\r\n node: node,\r\n actions: filteredActions,\r\n onAction: nodeActionHandler,\r\n dir: contentDirection(),\r\n }\"\r\n >\r\n </ng-container>\r\n </div>\r\n <div\r\n fNodeInput\r\n [fInputId]=\"node._computedId\"\r\n [fInputConnectableSide]=\"configuration().inputSide\"\r\n [fInputMultiple]=\"true\"\r\n [ngClass]=\"configuration().inputSide\"\r\n ></div>\r\n\r\n <div\r\n fNodeOutput\r\n [fOutputId]=\"node._computedId\"\r\n [fOutputConnectableSide]=\"configuration().outputSide\"\r\n [isSelfConnectable]=\"false\"\r\n [fOutputMultiple]=\"true\"\r\n [ngClass]=\"configuration().outputSide\"\r\n class=\"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\r\n <ng-template\r\n #defaultNodeTemplate\r\n let-node\r\n let-actions=\"actions\"\r\n let-onAction=\"onAction\"\r\n >\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 (action of actions; track action.key) {\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)=\"onAction(action, node)\"\r\n >\r\n </mt-button>\r\n }\r\n </div>\r\n </ng-template>\r\n </f-canvas>\r\n </f-flow>\r\n</div>\r\n@if (!readonly()) {\n <mt-toolbar />\n}\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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@masterteam/structure-builder",
3
- "version": "0.0.33",
3
+ "version": "0.0.34",
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.87",
24
- "@masterteam/forms": "^0.0.35",
25
- "@masterteam/icons": "^0.0.13"
23
+ "@masterteam/icons": "^0.0.13",
24
+ "@masterteam/components": "^0.0.98",
25
+ "@masterteam/forms": "^0.0.45"
26
26
  },
27
27
  "sideEffects": false,
28
28
  "exports": {
@@ -88,6 +88,7 @@ declare class StructureBuilder {
88
88
  nodeActions: _angular_core.InputSignal<Actions[]>;
89
89
  nodeFields: _angular_core.InputSignal<NodeFieldsMapping>;
90
90
  isAutoLayout: _angular_core.InputSignal<boolean>;
91
+ readonly: _angular_core.InputSignal<boolean>;
91
92
  addModalType: _angular_core.InputSignal<"drawer" | "dialog">;
92
93
  updateModalType: _angular_core.InputSignal<"drawer" | "dialog">;
93
94
  addModalStyleClass: _angular_core.InputSignal<string>;
@@ -166,7 +167,7 @@ declare class StructureBuilder {
166
167
  private buildAdjacency;
167
168
  private getDescendants;
168
169
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StructureBuilder, never>;
169
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StructureBuilder, "mt-structure-builder", never, { "availableNodes": { "alias": "availableNodes"; "required": false; "isSignal": true; }; "nodeForm": { "alias": "nodeForm"; "required": false; "isSignal": true; }; "connectionForm": { "alias": "connectionForm"; "required": false; "isSignal": true; }; "nodeActions": { "alias": "nodeActions"; "required": false; "isSignal": true; }; "nodeFields": { "alias": "nodeFields"; "required": false; "isSignal": true; }; "isAutoLayout": { "alias": "isAutoLayout"; "required": false; "isSignal": true; }; "addModalType": { "alias": "addModalType"; "required": false; "isSignal": true; }; "updateModalType": { "alias": "updateModalType"; "required": false; "isSignal": true; }; "addModalStyleClass": { "alias": "addModalStyleClass"; "required": false; "isSignal": true; }; "updateModalStyleClass": { "alias": "updateModalStyleClass"; "required": false; "isSignal": true; }; "addModalHeader": { "alias": "addModalHeader"; "required": false; "isSignal": true; }; "updateModalHeader": { "alias": "updateModalHeader"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "availableTabsClass": { "alias": "availableTabsClass"; "required": false; "isSignal": true; }; "layoutDirection": { "alias": "layoutDirection"; "required": false; "isSignal": true; }; "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "connections": { "alias": "connections"; "required": false; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; }, { "nodeActionsEvent": "nodeActionsEvent"; "action": "action"; "nodes": "nodesChange"; "connections": "connectionsChange"; }, ["nodeDialogTemplate", "nodeTemplateContent"], ["[flowContent]"], true, never>;
170
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StructureBuilder, "mt-structure-builder", never, { "availableNodes": { "alias": "availableNodes"; "required": false; "isSignal": true; }; "nodeForm": { "alias": "nodeForm"; "required": false; "isSignal": true; }; "connectionForm": { "alias": "connectionForm"; "required": false; "isSignal": true; }; "nodeActions": { "alias": "nodeActions"; "required": false; "isSignal": true; }; "nodeFields": { "alias": "nodeFields"; "required": false; "isSignal": true; }; "isAutoLayout": { "alias": "isAutoLayout"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "addModalType": { "alias": "addModalType"; "required": false; "isSignal": true; }; "updateModalType": { "alias": "updateModalType"; "required": false; "isSignal": true; }; "addModalStyleClass": { "alias": "addModalStyleClass"; "required": false; "isSignal": true; }; "updateModalStyleClass": { "alias": "updateModalStyleClass"; "required": false; "isSignal": true; }; "addModalHeader": { "alias": "addModalHeader"; "required": false; "isSignal": true; }; "updateModalHeader": { "alias": "updateModalHeader"; "required": false; "isSignal": true; }; "appendTo": { "alias": "appendTo"; "required": false; "isSignal": true; }; "availableTabsClass": { "alias": "availableTabsClass"; "required": false; "isSignal": true; }; "layoutDirection": { "alias": "layoutDirection"; "required": false; "isSignal": true; }; "nodes": { "alias": "nodes"; "required": false; "isSignal": true; }; "connections": { "alias": "connections"; "required": false; "isSignal": true; }; "nodeTemplate": { "alias": "nodeTemplate"; "required": false; "isSignal": true; }; }, { "nodeActionsEvent": "nodeActionsEvent"; "action": "action"; "nodes": "nodesChange"; "connections": "connectionsChange"; }, ["nodeDialogTemplate", "nodeTemplateContent"], ["[flowContent]"], true, never>;
170
171
  }
171
172
 
172
173
  export { StructureBuilder };