@mosaicoo/form-angular 0.9.1 → 0.9.3

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.
@@ -2089,7 +2089,7 @@ class FormDesignerComponent {
2089
2089
  </div>
2090
2090
  </section>
2091
2091
  </ng-template>
2092
- `, isInline: true, styles: [".dz-shell{display:flex;flex-direction:column;height:100%;min-height:480px;font-family:var(--mform-font, system-ui, \"Segoe UI\", sans-serif);color:var(--mform-text, #1f1b2e);background:var(--mform-bg, #f6f5fa);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);overflow:hidden}.dz-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-tools{display:flex;align-items:center;gap:6px}.dz-toolbar button{font:inherit;font-size:13px;padding:6px 10px;border:1px solid transparent;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-toolbar button:hover:not(:disabled){background:var(--mform-bg, #f6f5fa)}.dz-toolbar button:disabled{opacity:.35;cursor:default}.dz-toolbar .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-sep{width:1px;height:18px;background:var(--mform-border, #d9d5e6)}.dz-diag-badge{color:#b45309;font-weight:600}.dz-diagnostics{max-height:140px;overflow-y:auto;padding:8px 14px;background:#fdf5ef;border-bottom:1px solid var(--mform-border, #d9d5e6);font-size:12px}.dz-diag{padding:2px 0;color:#9a3412}.dz-diag.is-warning{color:#92400e}.dz-diag code{font-weight:600;margin-right:6px}.dz-diag em{color:var(--mform-muted, #6b6580);margin-left:6px}.dz-dialog{padding:14px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-dialog h4{margin:0 0 8px;font-size:13px}.dz-dialog textarea{width:100%;font-family:ui-monospace,Consolas,monospace;font-size:12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;box-sizing:border-box;resize:vertical}.dz-dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.dz-dialog-actions button{font:inherit;font-size:13px;padding:7px 14px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:none;cursor:pointer}.dz-dialog-actions .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff);border-color:transparent}.dz-import-error{color:var(--mform-danger, #c62842);font-size:12px}.dz-body{display:grid;flex:1;min-height:0}.dz-dock{display:flex;flex-direction:column;min-height:0;overflow-y:auto;background:var(--mform-surface, #fff)}.dz-dock-left{border-right:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-dock-right{border-left:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-splitter{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;touch-action:none;z-index:2}.dz-splitter-left{right:-3px}.dz-splitter-right{left:-3px}.dz-splitter:hover,.dz-splitter:active{background:var(--mform-primary, #6d4bd0);opacity:.35}.dz-panel{display:flex;flex-direction:column;border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-panel:last-child{border-bottom:none;flex:1}.dz-panel-head{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);position:sticky;top:0;z-index:1}.dz-panel-actions{display:flex;gap:2px;opacity:0;transition:opacity .12s}.dz-panel:hover .dz-panel-actions,.dz-panel:focus-within .dz-panel-actions{opacity:1}.dz-panel-actions button{border:none;background:none;color:inherit;cursor:pointer;font-size:11px;padding:2px 4px;border-radius:4px}.dz-panel-actions button:hover{background:var(--mform-surface, #fff)}.dz-panel-body{padding:10px}.dz-menu{position:relative}.dz-menu-panel{position:absolute;top:calc(100% + 6px);right:0;z-index:20;min-width:260px;padding:8px;background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);box-shadow:0 10px 30px #1f1b2e26}.dz-menu-title{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);padding:6px 6px 4px}.dz-menu-row{display:flex;align-items:center;justify-content:space-between;padding:4px 6px;font-size:13px}.dz-seg{display:flex;gap:2px}.dz-seg button{border:1px solid var(--mform-border, #d9d5e6);background:none;color:var(--mform-muted, #6b6580);border-radius:6px;font-size:11px;padding:3px 8px;cursor:pointer}.dz-seg button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-menu-item{display:block;width:100%;text-align:left;font:inherit;font-size:13px;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-menu-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-group{margin-bottom:4px}.dz-group-toggle{display:flex;align-items:center;gap:6px;width:100%;font:inherit;font-size:12px;font-weight:600;text-align:left;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-group-toggle:hover{background:var(--mform-bg, #f6f5fa)}.dz-caret{font-size:10px;color:var(--mform-muted, #6b6580);width:10px}.dz-group-count{margin-left:auto;font-size:10px;font-weight:400;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);border-radius:999px;padding:1px 7px}.dz-group-entries{display:flex;flex-direction:column;gap:2px;margin:2px 0 6px 10px}.dz-palette-item{display:flex;align-items:center;gap:8px;font:inherit;font-size:13px;text-align:left;padding:6px 8px;border:none;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-palette-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-icon{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px;font-size:11px}.dz-tree{display:flex;flex-direction:column;gap:1px}.dz-tree-item{font:inherit;font-size:12px;text-align:left;padding:4px 8px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dz-tree-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-tree-item.is-selected{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-canvas{padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px}.dz-canvas-empty,.dz-empty{color:var(--mform-muted, #6b6580);font-size:13px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:18px;text-align:center}.dz-dropzone{height:4px;border-radius:999px;transition:height .1s,background .1s}.dz-canvas.is-dragging .dz-dropzone{height:14px;background:repeating-linear-gradient(90deg,var(--mform-border, #d9d5e6) 0 6px,transparent 6px 12px)}.dz-canvas.is-dragging .dz-dropzone.is-over{height:22px;background:var(--mform-primary, #6d4bd0)}.dz-palette-row{display:flex;align-items:center;gap:2px}.dz-palette-row .dz-palette-item{flex:1;cursor:grab}.dz-block-remove{border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer;font-size:11px;padding:2px 4px;opacity:0}.dz-palette-row:hover .dz-block-remove{opacity:1}.dz-node{position:relative;border:1px solid transparent;border-radius:var(--mform-radius, 10px);padding:20px 10px 10px;cursor:pointer;background:var(--mform-surface, #fff)}.dz-node:hover{border-color:var(--mform-border, #d9d5e6)}.dz-node.is-selected{border-color:var(--mform-primary, #6d4bd0);box-shadow:0 0 0 1px var(--mform-primary, #6d4bd0)}.dz-chip{position:absolute;top:2px;left:10px;font-size:10px;color:var(--mform-muted, #6b6580);pointer-events:none}.dz-node.is-selected>.dz-chip{color:var(--mform-primary, #6d4bd0);font-weight:600}.dz-children{display:flex;flex-direction:column;gap:8px}.dz-columns{display:grid;gap:10px}.dz-column{display:flex;flex-direction:column;gap:8px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:8px;padding:8px;min-height:40px}.dz-tabbar{display:flex;gap:4px;margin-bottom:8px;border-bottom:2px solid var(--mform-border, #d9d5e6)}.dz-tab{font:inherit;font-size:12px;padding:5px 12px;border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer}.dz-tab.is-active{color:var(--mform-primary, #6d4bd0);font-weight:600;border-bottom:2px solid var(--mform-primary, #6d4bd0);margin-bottom:-2px}.dz-leaf{pointer-events:none}.dz-props-empty{margin:4px 0}.dz-inspector{display:flex;flex-direction:column;gap:10px}.dz-inspector h3{margin:0;font-size:13px}.dz-inspector h3 code{color:var(--mform-muted, #6b6580);font-weight:400}.dz-prop{display:flex;flex-direction:column;gap:4px;font-size:12px}.dz-prop span{color:var(--mform-muted, #6b6580)}.dz-prop input,.dz-prop select,.dz-prop textarea{font:inherit;font-size:13px;padding:7px 9px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:#fff;width:100%;box-sizing:border-box}.dz-check{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer}.dz-check input{accent-color:var(--mform-primary, #6d4bd0)}.dz-section{border-top:1px solid var(--mform-border, #d9d5e6);padding-top:8px}.dz-section summary{font-size:12px;font-weight:600;cursor:pointer;margin-bottom:8px}.dz-section .dz-prop{margin-bottom:8px}.dz-option-row{display:flex;gap:6px;margin-bottom:6px}.dz-option-row input{flex:1;min-width:0;font-size:12px;padding:6px 8px;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px}.dz-option-row button{border:none;background:none;cursor:pointer;color:var(--mform-muted, #6b6580)}.dz-add{font:inherit;font-size:12px;border:1px dashed var(--mform-primary, #6d4bd0);color:var(--mform-primary, #6d4bd0);background:none;border-radius:8px;padding:6px 10px;cursor:pointer}.dz-preview{padding:20px;overflow-y:auto}.dz-viewports{display:flex;gap:4px;justify-content:center;margin-bottom:16px}.dz-viewports button{font:inherit;font-size:12px;padding:5px 12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:999px;background:var(--mform-surface, #fff);color:var(--mform-muted, #6b6580);cursor:pointer}.dz-viewports button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-preview-frame{margin:0 auto;transition:max-width .16s}.dz-preview-frame.is-constrained{border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:16px;background:var(--mform-surface, #fff);box-shadow:0 8px 28px #1f1b2e14}.dz-preview-data{margin-top:16px;font-size:12px}.dz-preview-data pre{background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: DesignerNodeComponent, selector: "mform-designer-node", inputs: ["node", "path", "engine", "selected", "dragging", "activeDrop"], outputs: ["selectNode", "nodeDragStart", "dragOverTarget", "dropOnTarget", "dragFinished"] }, { kind: "component", type: InspectorComponent, selector: "mform-inspector", inputs: ["node", "schema"], outputs: ["nodePatch"] }, { kind: "component", type: FormRendererComponent, selector: "mform-renderer", inputs: ["schema", "source", "initialData", "optionsProviders", "messages", "validators", "mode", "submitHandler", "labels"], outputs: ["submitted", "valueChanged"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2092
+ `, isInline: true, styles: [".dz-shell{display:flex;flex-direction:column;height:100%;min-height:480px;font-family:var(--mform-font, system-ui, \"Segoe UI\", sans-serif);color:var(--mform-text, #1f1b2e);background:var(--mform-bg, #f6f5fa);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);overflow:hidden}.dz-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-tools{display:flex;align-items:center;gap:6px}.dz-toolbar button{font:inherit;font-size:13px;padding:6px 10px;border:1px solid transparent;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-toolbar button:hover:not(:disabled){background:var(--mform-bg, #f6f5fa)}.dz-toolbar button:disabled{opacity:.35;cursor:default}.dz-toolbar .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-sep{width:1px;height:18px;background:var(--mform-border, #d9d5e6)}.dz-diag-badge{color:var(--mform-warning, #b45309);font-weight:600}.dz-diagnostics{max-height:140px;overflow-y:auto;padding:8px 14px;background:var(--mform-warning-bg, #fdf5ef);border-bottom:1px solid var(--mform-border, #d9d5e6);font-size:12px}.dz-diag{padding:2px 0;color:var(--mform-warning, #9a3412)}.dz-diag.is-warning{color:var(--mform-warning, #92400e)}.dz-diag code{font-weight:600;margin-right:6px}.dz-diag em{color:var(--mform-muted, #6b6580);margin-left:6px}.dz-dialog{padding:14px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-dialog h4{margin:0 0 8px;font-size:13px}.dz-dialog textarea{width:100%;font-family:ui-monospace,Consolas,monospace;font-size:12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;box-sizing:border-box;resize:vertical}.dz-dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.dz-dialog-actions button{font:inherit;font-size:13px;padding:7px 14px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:none;cursor:pointer}.dz-dialog-actions .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff);border-color:transparent}.dz-import-error{color:var(--mform-danger, #c62842);font-size:12px}.dz-body{display:grid;flex:1;min-height:0}.dz-dock{display:flex;flex-direction:column;min-height:0;overflow-y:auto;background:var(--mform-surface, #fff)}.dz-dock-left{border-right:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-dock-right{border-left:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-splitter{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;touch-action:none;z-index:2}.dz-splitter-left{right:-3px}.dz-splitter-right{left:-3px}.dz-splitter:hover,.dz-splitter:active{background:var(--mform-primary, #6d4bd0);opacity:.35}.dz-panel{display:flex;flex-direction:column;border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-panel:last-child{border-bottom:none;flex:1}.dz-panel-head{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);position:sticky;top:0;z-index:1}.dz-panel-actions{display:flex;gap:2px;opacity:0;transition:opacity .12s}.dz-panel:hover .dz-panel-actions,.dz-panel:focus-within .dz-panel-actions{opacity:1}.dz-panel-actions button{border:none;background:none;color:inherit;cursor:pointer;font-size:11px;padding:2px 4px;border-radius:4px}.dz-panel-actions button:hover{background:var(--mform-surface, #fff)}.dz-panel-body{padding:10px}.dz-menu{position:relative}.dz-menu-panel{position:absolute;top:calc(100% + 6px);right:0;z-index:20;min-width:260px;padding:8px;background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);box-shadow:0 10px 30px #1f1b2e26}.dz-menu-title{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);padding:6px 6px 4px}.dz-menu-row{display:flex;align-items:center;justify-content:space-between;padding:4px 6px;font-size:13px}.dz-seg{display:flex;gap:2px}.dz-seg button{border:1px solid var(--mform-border, #d9d5e6);background:none;color:var(--mform-muted, #6b6580);border-radius:6px;font-size:11px;padding:3px 8px;cursor:pointer}.dz-seg button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-menu-item{display:block;width:100%;text-align:left;font:inherit;font-size:13px;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-menu-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-group{margin-bottom:4px}.dz-group-toggle{display:flex;align-items:center;gap:6px;width:100%;font:inherit;font-size:12px;font-weight:600;text-align:left;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-group-toggle:hover{background:var(--mform-bg, #f6f5fa)}.dz-caret{font-size:10px;color:var(--mform-muted, #6b6580);width:10px}.dz-group-count{margin-left:auto;font-size:10px;font-weight:400;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);border-radius:999px;padding:1px 7px}.dz-group-entries{display:flex;flex-direction:column;gap:2px;margin:2px 0 6px 10px}.dz-palette-item{display:flex;align-items:center;gap:8px;font:inherit;font-size:13px;text-align:left;padding:6px 8px;border:none;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-palette-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-icon{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px;font-size:11px}.dz-tree{display:flex;flex-direction:column;gap:1px}.dz-tree-item{font:inherit;font-size:12px;text-align:left;padding:4px 8px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dz-tree-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-tree-item.is-selected{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-canvas{padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px}.dz-canvas-empty,.dz-empty{color:var(--mform-muted, #6b6580);font-size:13px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:18px;text-align:center}.dz-dropzone{height:4px;border-radius:999px;transition:height .1s,background .1s}.dz-canvas.is-dragging .dz-dropzone{height:14px;background:repeating-linear-gradient(90deg,var(--mform-border, #d9d5e6) 0 6px,transparent 6px 12px)}.dz-canvas.is-dragging .dz-dropzone.is-over{height:22px;background:var(--mform-primary, #6d4bd0)}.dz-palette-row{display:flex;align-items:center;gap:2px}.dz-palette-row .dz-palette-item{flex:1;cursor:grab}.dz-block-remove{border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer;font-size:11px;padding:2px 4px;opacity:0}.dz-palette-row:hover .dz-block-remove{opacity:1}.dz-node{position:relative;border:1px solid transparent;border-radius:var(--mform-radius, 10px);padding:20px 10px 10px;cursor:pointer;background:var(--mform-surface, #fff)}.dz-node:hover{border-color:var(--mform-border, #d9d5e6)}.dz-node.is-selected{border-color:var(--mform-primary, #6d4bd0);box-shadow:0 0 0 1px var(--mform-primary, #6d4bd0)}.dz-chip{position:absolute;top:2px;left:10px;font-size:10px;color:var(--mform-muted, #6b6580);pointer-events:none}.dz-node.is-selected>.dz-chip{color:var(--mform-primary, #6d4bd0);font-weight:600}.dz-children{display:flex;flex-direction:column;gap:8px}.dz-columns{display:grid;gap:10px}.dz-column{display:flex;flex-direction:column;gap:8px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:8px;padding:8px;min-height:40px}.dz-tabbar{display:flex;gap:4px;margin-bottom:8px;border-bottom:2px solid var(--mform-border, #d9d5e6)}.dz-tab{font:inherit;font-size:12px;padding:5px 12px;border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer}.dz-tab.is-active{color:var(--mform-primary, #6d4bd0);font-weight:600;border-bottom:2px solid var(--mform-primary, #6d4bd0);margin-bottom:-2px}.dz-leaf{pointer-events:none}.dz-props-empty{margin:4px 0}.dz-inspector{display:flex;flex-direction:column;gap:10px}.dz-inspector h3{margin:0;font-size:13px}.dz-inspector h3 code{color:var(--mform-muted, #6b6580);font-weight:400}.dz-prop{display:flex;flex-direction:column;gap:4px;font-size:12px}.dz-prop span{color:var(--mform-muted, #6b6580)}.dz-prop input,.dz-prop select,.dz-prop textarea{font:inherit;font-size:13px;padding:7px 9px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:var(--mform-control-bg, #fff);color:inherit;width:100%;box-sizing:border-box}.dz-check{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer}.dz-check input{accent-color:var(--mform-primary, #6d4bd0)}.dz-section{border-top:1px solid var(--mform-border, #d9d5e6);padding-top:8px}.dz-section summary{font-size:12px;font-weight:600;cursor:pointer;margin-bottom:8px}.dz-section .dz-prop{margin-bottom:8px}.dz-option-row{display:flex;gap:6px;margin-bottom:6px}.dz-option-row input{flex:1;min-width:0;font-size:12px;padding:6px 8px;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px}.dz-option-row button{border:none;background:none;cursor:pointer;color:var(--mform-muted, #6b6580)}.dz-add{font:inherit;font-size:12px;border:1px dashed var(--mform-primary, #6d4bd0);color:var(--mform-primary, #6d4bd0);background:none;border-radius:8px;padding:6px 10px;cursor:pointer}.dz-preview{padding:20px;overflow-y:auto}.dz-viewports{display:flex;gap:4px;justify-content:center;margin-bottom:16px}.dz-viewports button{font:inherit;font-size:12px;padding:5px 12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:999px;background:var(--mform-surface, #fff);color:var(--mform-muted, #6b6580);cursor:pointer}.dz-viewports button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-preview-frame{margin:0 auto;transition:max-width .16s}.dz-preview-frame.is-constrained{border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:16px;background:var(--mform-surface, #fff);box-shadow:0 8px 28px #1f1b2e14}.dz-preview-data{margin-top:16px;font-size:12px}.dz-preview-data pre{background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;overflow-x:auto}\n"], dependencies: [{ kind: "component", type: DesignerNodeComponent, selector: "mform-designer-node", inputs: ["node", "path", "engine", "selected", "dragging", "activeDrop"], outputs: ["selectNode", "nodeDragStart", "dragOverTarget", "dropOnTarget", "dragFinished"] }, { kind: "component", type: InspectorComponent, selector: "mform-inspector", inputs: ["node", "schema"], outputs: ["nodePatch"] }, { kind: "component", type: FormRendererComponent, selector: "mform-renderer", inputs: ["schema", "source", "initialData", "optionsProviders", "messages", "validators", "mode", "submitHandler", "labels"], outputs: ["submitted", "valueChanged"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: JsonPipe, name: "json" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2093
2093
  }
2094
2094
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImport: i0, type: FormDesignerComponent, decorators: [{
2095
2095
  type: Component,
@@ -2385,7 +2385,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.19", ngImpo
2385
2385
  </div>
2386
2386
  </section>
2387
2387
  </ng-template>
2388
- `, styles: [".dz-shell{display:flex;flex-direction:column;height:100%;min-height:480px;font-family:var(--mform-font, system-ui, \"Segoe UI\", sans-serif);color:var(--mform-text, #1f1b2e);background:var(--mform-bg, #f6f5fa);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);overflow:hidden}.dz-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-tools{display:flex;align-items:center;gap:6px}.dz-toolbar button{font:inherit;font-size:13px;padding:6px 10px;border:1px solid transparent;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-toolbar button:hover:not(:disabled){background:var(--mform-bg, #f6f5fa)}.dz-toolbar button:disabled{opacity:.35;cursor:default}.dz-toolbar .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-sep{width:1px;height:18px;background:var(--mform-border, #d9d5e6)}.dz-diag-badge{color:#b45309;font-weight:600}.dz-diagnostics{max-height:140px;overflow-y:auto;padding:8px 14px;background:#fdf5ef;border-bottom:1px solid var(--mform-border, #d9d5e6);font-size:12px}.dz-diag{padding:2px 0;color:#9a3412}.dz-diag.is-warning{color:#92400e}.dz-diag code{font-weight:600;margin-right:6px}.dz-diag em{color:var(--mform-muted, #6b6580);margin-left:6px}.dz-dialog{padding:14px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-dialog h4{margin:0 0 8px;font-size:13px}.dz-dialog textarea{width:100%;font-family:ui-monospace,Consolas,monospace;font-size:12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;box-sizing:border-box;resize:vertical}.dz-dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.dz-dialog-actions button{font:inherit;font-size:13px;padding:7px 14px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:none;cursor:pointer}.dz-dialog-actions .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff);border-color:transparent}.dz-import-error{color:var(--mform-danger, #c62842);font-size:12px}.dz-body{display:grid;flex:1;min-height:0}.dz-dock{display:flex;flex-direction:column;min-height:0;overflow-y:auto;background:var(--mform-surface, #fff)}.dz-dock-left{border-right:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-dock-right{border-left:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-splitter{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;touch-action:none;z-index:2}.dz-splitter-left{right:-3px}.dz-splitter-right{left:-3px}.dz-splitter:hover,.dz-splitter:active{background:var(--mform-primary, #6d4bd0);opacity:.35}.dz-panel{display:flex;flex-direction:column;border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-panel:last-child{border-bottom:none;flex:1}.dz-panel-head{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);position:sticky;top:0;z-index:1}.dz-panel-actions{display:flex;gap:2px;opacity:0;transition:opacity .12s}.dz-panel:hover .dz-panel-actions,.dz-panel:focus-within .dz-panel-actions{opacity:1}.dz-panel-actions button{border:none;background:none;color:inherit;cursor:pointer;font-size:11px;padding:2px 4px;border-radius:4px}.dz-panel-actions button:hover{background:var(--mform-surface, #fff)}.dz-panel-body{padding:10px}.dz-menu{position:relative}.dz-menu-panel{position:absolute;top:calc(100% + 6px);right:0;z-index:20;min-width:260px;padding:8px;background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);box-shadow:0 10px 30px #1f1b2e26}.dz-menu-title{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);padding:6px 6px 4px}.dz-menu-row{display:flex;align-items:center;justify-content:space-between;padding:4px 6px;font-size:13px}.dz-seg{display:flex;gap:2px}.dz-seg button{border:1px solid var(--mform-border, #d9d5e6);background:none;color:var(--mform-muted, #6b6580);border-radius:6px;font-size:11px;padding:3px 8px;cursor:pointer}.dz-seg button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-menu-item{display:block;width:100%;text-align:left;font:inherit;font-size:13px;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-menu-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-group{margin-bottom:4px}.dz-group-toggle{display:flex;align-items:center;gap:6px;width:100%;font:inherit;font-size:12px;font-weight:600;text-align:left;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-group-toggle:hover{background:var(--mform-bg, #f6f5fa)}.dz-caret{font-size:10px;color:var(--mform-muted, #6b6580);width:10px}.dz-group-count{margin-left:auto;font-size:10px;font-weight:400;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);border-radius:999px;padding:1px 7px}.dz-group-entries{display:flex;flex-direction:column;gap:2px;margin:2px 0 6px 10px}.dz-palette-item{display:flex;align-items:center;gap:8px;font:inherit;font-size:13px;text-align:left;padding:6px 8px;border:none;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-palette-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-icon{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px;font-size:11px}.dz-tree{display:flex;flex-direction:column;gap:1px}.dz-tree-item{font:inherit;font-size:12px;text-align:left;padding:4px 8px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dz-tree-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-tree-item.is-selected{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-canvas{padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px}.dz-canvas-empty,.dz-empty{color:var(--mform-muted, #6b6580);font-size:13px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:18px;text-align:center}.dz-dropzone{height:4px;border-radius:999px;transition:height .1s,background .1s}.dz-canvas.is-dragging .dz-dropzone{height:14px;background:repeating-linear-gradient(90deg,var(--mform-border, #d9d5e6) 0 6px,transparent 6px 12px)}.dz-canvas.is-dragging .dz-dropzone.is-over{height:22px;background:var(--mform-primary, #6d4bd0)}.dz-palette-row{display:flex;align-items:center;gap:2px}.dz-palette-row .dz-palette-item{flex:1;cursor:grab}.dz-block-remove{border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer;font-size:11px;padding:2px 4px;opacity:0}.dz-palette-row:hover .dz-block-remove{opacity:1}.dz-node{position:relative;border:1px solid transparent;border-radius:var(--mform-radius, 10px);padding:20px 10px 10px;cursor:pointer;background:var(--mform-surface, #fff)}.dz-node:hover{border-color:var(--mform-border, #d9d5e6)}.dz-node.is-selected{border-color:var(--mform-primary, #6d4bd0);box-shadow:0 0 0 1px var(--mform-primary, #6d4bd0)}.dz-chip{position:absolute;top:2px;left:10px;font-size:10px;color:var(--mform-muted, #6b6580);pointer-events:none}.dz-node.is-selected>.dz-chip{color:var(--mform-primary, #6d4bd0);font-weight:600}.dz-children{display:flex;flex-direction:column;gap:8px}.dz-columns{display:grid;gap:10px}.dz-column{display:flex;flex-direction:column;gap:8px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:8px;padding:8px;min-height:40px}.dz-tabbar{display:flex;gap:4px;margin-bottom:8px;border-bottom:2px solid var(--mform-border, #d9d5e6)}.dz-tab{font:inherit;font-size:12px;padding:5px 12px;border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer}.dz-tab.is-active{color:var(--mform-primary, #6d4bd0);font-weight:600;border-bottom:2px solid var(--mform-primary, #6d4bd0);margin-bottom:-2px}.dz-leaf{pointer-events:none}.dz-props-empty{margin:4px 0}.dz-inspector{display:flex;flex-direction:column;gap:10px}.dz-inspector h3{margin:0;font-size:13px}.dz-inspector h3 code{color:var(--mform-muted, #6b6580);font-weight:400}.dz-prop{display:flex;flex-direction:column;gap:4px;font-size:12px}.dz-prop span{color:var(--mform-muted, #6b6580)}.dz-prop input,.dz-prop select,.dz-prop textarea{font:inherit;font-size:13px;padding:7px 9px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:#fff;width:100%;box-sizing:border-box}.dz-check{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer}.dz-check input{accent-color:var(--mform-primary, #6d4bd0)}.dz-section{border-top:1px solid var(--mform-border, #d9d5e6);padding-top:8px}.dz-section summary{font-size:12px;font-weight:600;cursor:pointer;margin-bottom:8px}.dz-section .dz-prop{margin-bottom:8px}.dz-option-row{display:flex;gap:6px;margin-bottom:6px}.dz-option-row input{flex:1;min-width:0;font-size:12px;padding:6px 8px;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px}.dz-option-row button{border:none;background:none;cursor:pointer;color:var(--mform-muted, #6b6580)}.dz-add{font:inherit;font-size:12px;border:1px dashed var(--mform-primary, #6d4bd0);color:var(--mform-primary, #6d4bd0);background:none;border-radius:8px;padding:6px 10px;cursor:pointer}.dz-preview{padding:20px;overflow-y:auto}.dz-viewports{display:flex;gap:4px;justify-content:center;margin-bottom:16px}.dz-viewports button{font:inherit;font-size:12px;padding:5px 12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:999px;background:var(--mform-surface, #fff);color:var(--mform-muted, #6b6580);cursor:pointer}.dz-viewports button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-preview-frame{margin:0 auto;transition:max-width .16s}.dz-preview-frame.is-constrained{border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:16px;background:var(--mform-surface, #fff);box-shadow:0 8px 28px #1f1b2e14}.dz-preview-data{margin-top:16px;font-size:12px}.dz-preview-data pre{background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;overflow-x:auto}\n"] }]
2388
+ `, styles: [".dz-shell{display:flex;flex-direction:column;height:100%;min-height:480px;font-family:var(--mform-font, system-ui, \"Segoe UI\", sans-serif);color:var(--mform-text, #1f1b2e);background:var(--mform-bg, #f6f5fa);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);overflow:hidden}.dz-toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-tools{display:flex;align-items:center;gap:6px}.dz-toolbar button{font:inherit;font-size:13px;padding:6px 10px;border:1px solid transparent;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-toolbar button:hover:not(:disabled){background:var(--mform-bg, #f6f5fa)}.dz-toolbar button:disabled{opacity:.35;cursor:default}.dz-toolbar .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-sep{width:1px;height:18px;background:var(--mform-border, #d9d5e6)}.dz-diag-badge{color:var(--mform-warning, #b45309);font-weight:600}.dz-diagnostics{max-height:140px;overflow-y:auto;padding:8px 14px;background:var(--mform-warning-bg, #fdf5ef);border-bottom:1px solid var(--mform-border, #d9d5e6);font-size:12px}.dz-diag{padding:2px 0;color:var(--mform-warning, #9a3412)}.dz-diag.is-warning{color:var(--mform-warning, #92400e)}.dz-diag code{font-weight:600;margin-right:6px}.dz-diag em{color:var(--mform-muted, #6b6580);margin-left:6px}.dz-dialog{padding:14px;background:var(--mform-surface, #fff);border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-dialog h4{margin:0 0 8px;font-size:13px}.dz-dialog textarea{width:100%;font-family:ui-monospace,Consolas,monospace;font-size:12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;box-sizing:border-box;resize:vertical}.dz-dialog-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}.dz-dialog-actions button{font:inherit;font-size:13px;padding:7px 14px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:none;cursor:pointer}.dz-dialog-actions .dz-primary{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff);border-color:transparent}.dz-import-error{color:var(--mform-danger, #c62842);font-size:12px}.dz-body{display:grid;flex:1;min-height:0}.dz-dock{display:flex;flex-direction:column;min-height:0;overflow-y:auto;background:var(--mform-surface, #fff)}.dz-dock-left{border-right:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-dock-right{border-left:1px solid var(--mform-border, #d9d5e6);position:relative}.dz-splitter{position:absolute;top:0;bottom:0;width:6px;cursor:col-resize;touch-action:none;z-index:2}.dz-splitter-left{right:-3px}.dz-splitter-right{left:-3px}.dz-splitter:hover,.dz-splitter:active{background:var(--mform-primary, #6d4bd0);opacity:.35}.dz-panel{display:flex;flex-direction:column;border-bottom:1px solid var(--mform-border, #d9d5e6)}.dz-panel:last-child{border-bottom:none;flex:1}.dz-panel-head{display:flex;align-items:center;justify-content:space-between;padding:8px 10px;font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);position:sticky;top:0;z-index:1}.dz-panel-actions{display:flex;gap:2px;opacity:0;transition:opacity .12s}.dz-panel:hover .dz-panel-actions,.dz-panel:focus-within .dz-panel-actions{opacity:1}.dz-panel-actions button{border:none;background:none;color:inherit;cursor:pointer;font-size:11px;padding:2px 4px;border-radius:4px}.dz-panel-actions button:hover{background:var(--mform-surface, #fff)}.dz-panel-body{padding:10px}.dz-menu{position:relative}.dz-menu-panel{position:absolute;top:calc(100% + 6px);right:0;z-index:20;min-width:260px;padding:8px;background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);box-shadow:0 10px 30px #1f1b2e26}.dz-menu-title{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--mform-muted, #6b6580);padding:6px 6px 4px}.dz-menu-row{display:flex;align-items:center;justify-content:space-between;padding:4px 6px;font-size:13px}.dz-seg{display:flex;gap:2px}.dz-seg button{border:1px solid var(--mform-border, #d9d5e6);background:none;color:var(--mform-muted, #6b6580);border-radius:6px;font-size:11px;padding:3px 8px;cursor:pointer}.dz-seg button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-menu-item{display:block;width:100%;text-align:left;font:inherit;font-size:13px;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-menu-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-group{margin-bottom:4px}.dz-group-toggle{display:flex;align-items:center;gap:6px;width:100%;font:inherit;font-size:12px;font-weight:600;text-align:left;padding:6px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer}.dz-group-toggle:hover{background:var(--mform-bg, #f6f5fa)}.dz-caret{font-size:10px;color:var(--mform-muted, #6b6580);width:10px}.dz-group-count{margin-left:auto;font-size:10px;font-weight:400;color:var(--mform-muted, #6b6580);background:var(--mform-bg, #f6f5fa);border-radius:999px;padding:1px 7px}.dz-group-entries{display:flex;flex-direction:column;gap:2px;margin:2px 0 6px 10px}.dz-palette-item{display:flex;align-items:center;gap:8px;font:inherit;font-size:13px;text-align:left;padding:6px 8px;border:none;border-radius:8px;background:none;color:inherit;cursor:pointer}.dz-palette-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-icon{width:22px;height:22px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px;font-size:11px}.dz-tree{display:flex;flex-direction:column;gap:1px}.dz-tree-item{font:inherit;font-size:12px;text-align:left;padding:4px 8px;border:none;border-radius:6px;background:none;color:inherit;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dz-tree-item:hover{background:var(--mform-bg, #f6f5fa)}.dz-tree-item.is-selected{background:var(--mform-primary, #6d4bd0);color:var(--mform-primary-contrast, #fff)}.dz-canvas{padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px}.dz-canvas-empty,.dz-empty{color:var(--mform-muted, #6b6580);font-size:13px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:18px;text-align:center}.dz-dropzone{height:4px;border-radius:999px;transition:height .1s,background .1s}.dz-canvas.is-dragging .dz-dropzone{height:14px;background:repeating-linear-gradient(90deg,var(--mform-border, #d9d5e6) 0 6px,transparent 6px 12px)}.dz-canvas.is-dragging .dz-dropzone.is-over{height:22px;background:var(--mform-primary, #6d4bd0)}.dz-palette-row{display:flex;align-items:center;gap:2px}.dz-palette-row .dz-palette-item{flex:1;cursor:grab}.dz-block-remove{border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer;font-size:11px;padding:2px 4px;opacity:0}.dz-palette-row:hover .dz-block-remove{opacity:1}.dz-node{position:relative;border:1px solid transparent;border-radius:var(--mform-radius, 10px);padding:20px 10px 10px;cursor:pointer;background:var(--mform-surface, #fff)}.dz-node:hover{border-color:var(--mform-border, #d9d5e6)}.dz-node.is-selected{border-color:var(--mform-primary, #6d4bd0);box-shadow:0 0 0 1px var(--mform-primary, #6d4bd0)}.dz-chip{position:absolute;top:2px;left:10px;font-size:10px;color:var(--mform-muted, #6b6580);pointer-events:none}.dz-node.is-selected>.dz-chip{color:var(--mform-primary, #6d4bd0);font-weight:600}.dz-children{display:flex;flex-direction:column;gap:8px}.dz-columns{display:grid;gap:10px}.dz-column{display:flex;flex-direction:column;gap:8px;border:1px dashed var(--mform-border, #d9d5e6);border-radius:8px;padding:8px;min-height:40px}.dz-tabbar{display:flex;gap:4px;margin-bottom:8px;border-bottom:2px solid var(--mform-border, #d9d5e6)}.dz-tab{font:inherit;font-size:12px;padding:5px 12px;border:none;background:none;color:var(--mform-muted, #6b6580);cursor:pointer}.dz-tab.is-active{color:var(--mform-primary, #6d4bd0);font-weight:600;border-bottom:2px solid var(--mform-primary, #6d4bd0);margin-bottom:-2px}.dz-leaf{pointer-events:none}.dz-props-empty{margin:4px 0}.dz-inspector{display:flex;flex-direction:column;gap:10px}.dz-inspector h3{margin:0;font-size:13px}.dz-inspector h3 code{color:var(--mform-muted, #6b6580);font-weight:400}.dz-prop{display:flex;flex-direction:column;gap:4px;font-size:12px}.dz-prop span{color:var(--mform-muted, #6b6580)}.dz-prop input,.dz-prop select,.dz-prop textarea{font:inherit;font-size:13px;padding:7px 9px;border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;background:var(--mform-control-bg, #fff);color:inherit;width:100%;box-sizing:border-box}.dz-check{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer}.dz-check input{accent-color:var(--mform-primary, #6d4bd0)}.dz-section{border-top:1px solid var(--mform-border, #d9d5e6);padding-top:8px}.dz-section summary{font-size:12px;font-weight:600;cursor:pointer;margin-bottom:8px}.dz-section .dz-prop{margin-bottom:8px}.dz-option-row{display:flex;gap:6px;margin-bottom:6px}.dz-option-row input{flex:1;min-width:0;font-size:12px;padding:6px 8px;border:1px solid var(--mform-border, #d9d5e6);border-radius:6px}.dz-option-row button{border:none;background:none;cursor:pointer;color:var(--mform-muted, #6b6580)}.dz-add{font:inherit;font-size:12px;border:1px dashed var(--mform-primary, #6d4bd0);color:var(--mform-primary, #6d4bd0);background:none;border-radius:8px;padding:6px 10px;cursor:pointer}.dz-preview{padding:20px;overflow-y:auto}.dz-viewports{display:flex;gap:4px;justify-content:center;margin-bottom:16px}.dz-viewports button{font:inherit;font-size:12px;padding:5px 12px;border:1px solid var(--mform-border, #d9d5e6);border-radius:999px;background:var(--mform-surface, #fff);color:var(--mform-muted, #6b6580);cursor:pointer}.dz-viewports button.is-on{background:var(--mform-primary, #6d4bd0);border-color:transparent;color:var(--mform-primary-contrast, #fff)}.dz-preview-frame{margin:0 auto;transition:max-width .16s}.dz-preview-frame.is-constrained{border:1px solid var(--mform-border, #d9d5e6);border-radius:var(--mform-radius, 10px);padding:16px;background:var(--mform-surface, #fff);box-shadow:0 8px 28px #1f1b2e14}.dz-preview-data{margin-top:16px;font-size:12px}.dz-preview-data pre{background:var(--mform-surface, #fff);border:1px solid var(--mform-border, #d9d5e6);border-radius:8px;padding:10px;overflow-x:auto}\n"] }]
2389
2389
  }], ctorParameters: () => [], propDecorators: { schema: [{ type: i0.Input, args: [{ isSignal: true, alias: "schema", required: false }] }], source: [{ type: i0.Input, args: [{ isSignal: true, alias: "source", required: false }] }], extraCatalog: [{ type: i0.Input, args: [{ isSignal: true, alias: "extraCatalog", required: false }] }], catalogOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "catalog", required: false }] }], labels: [{ type: i0.Input, args: [{ isSignal: true, alias: "labels", required: false }] }], schemaChanged: [{ type: i0.Output, args: ["schemaChanged"] }], blocks: [{ type: i0.Input, args: [{ isSignal: true, alias: "blocks", required: false }] }], blocksChanged: [{ type: i0.Output, args: ["blocksChanged"] }] } });
2390
2390
 
2391
2391
  /*
@@ -1 +1 @@
1
- {"version":3,"file":"mosaicoo-form-angular-designer.mjs","sources":["../../../packages/angular/designer/src/drag-drop.ts","../../../packages/angular/designer/src/designer-node.component.ts","../../../packages/angular/designer/src/inspector.component.ts","../../../packages/angular/designer/src/field-catalog.ts","../../../packages/angular/designer/src/blocks.ts","../../../packages/angular/designer/src/designer-labels.ts","../../../packages/angular/designer/src/workspace.ts","../../../packages/angular/designer/src/designer.component.ts","../../../packages/angular/designer/src/public-api.ts","../../../packages/angular/designer/src/mosaicoo-form-angular-designer.ts"],"sourcesContent":["import type { NodePath } from '@mosaicoo/form-core';\n\n/**\n * Drop-target identity shared by the canvas and the node components.\n * A target is a position in a parent's children list, optionally bound to a\n * column of a `columns` container.\n */\nexport interface DropTarget {\n path: NodePath;\n /** Column index when the parent lays children out in columns. */\n column?: number;\n}\n\nexport function dropId(target: DropTarget): string {\n return target.column === undefined\n ? target.path.join('.')\n : `${target.path.join('.')}@${target.column}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type { ContainerField, FieldNode, FormEngine, NodePath } from '@mosaicoo/form-core';\nimport { FormNodeComponent } from '@mosaicoo/form-angular';\nimport { dropId, type DropTarget } from './drag-drop.js';\n\n/**\n * Canvas node: draws the selection frame and structure chrome, delegating\n * leaf rendering to the RUNTIME `<mform-node>` so what you see is what the\n * renderer will produce. Canvas controls are non-interactive — testing\n * happens in Preview mode.\n *\n * Drop zones sit between children (and inside each column), so fields can be\n * dragged INTO containers, not just reordered at the root.\n */\n@Component({\n selector: 'mform-designer-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [FormNodeComponent],\n template: `\n @let n = node();\n <div\n class=\"dz-node\"\n [class.is-selected]=\"isSelected()\"\n [class.is-container]=\"n.kind === 'container'\"\n (click)=\"onSelect($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"onSelect($event)\"\n [attr.aria-label]=\"chip() + (isSelected() ? ' (selected)' : '')\"\n >\n <span class=\"dz-chip\">{{ chip() }}</span>\n\n @if (n.kind === 'container') {\n @if (n.type === 'tabs') {\n <div class=\"dz-tabbar\">\n @for (tab of container().children; track tab.key; let i = $index) {\n <button\n type=\"button\"\n class=\"dz-tab\"\n [class.is-active]=\"activeTab() === i\"\n (click)=\"setTab(i, $event)\"\n >\n {{ tab.label || 'Tab ' + (i + 1) }}\n </button>\n }\n </div>\n @for (tab of container().children; track tab.key; let i = $index) {\n @if (activeTab() === i) {\n <div class=\"dz-children\">\n <mform-designer-node\n [node]=\"tab\"\n [path]=\"childPath(i)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n </div>\n }\n }\n } @else if (n.type === 'columns' && container().columns?.length) {\n <div class=\"dz-columns\" [style.grid-template-columns]=\"columnsTemplate()\">\n @for (column of container().columns; track $index; let c = $index) {\n <div class=\"dz-column\">\n @for (childIndex of column.children; track childIndex) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isOver(childPath(childIndex), c)\"\n (dragover)=\"onDragOver(childPath(childIndex), c, $event)\"\n (drop)=\"onDrop(childPath(childIndex), c, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"container().children[childIndex]!\"\n [path]=\"childPath(childIndex)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n draggable=\"true\"\n (dragstart)=\"onDragStart(childPath(childIndex), $event)\"\n (dragend)=\"dragFinished.emit()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isOver(childPath(container().children.length), c)\"\n (dragover)=\"onDragOver(childPath(container().children.length), c, $event)\"\n (drop)=\"onDrop(childPath(container().children.length), c, $event)\"\n ></div>\n @if (column.children.length === 0) {\n <div class=\"dz-empty\">empty column</div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"dz-children\">\n @for (child of container().children; track child.key; let i = $index) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isOver(childPath(i))\"\n (dragover)=\"onDragOver(childPath(i), undefined, $event)\"\n (drop)=\"onDrop(childPath(i), undefined, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"child\"\n [path]=\"childPath(i)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n draggable=\"true\"\n (dragstart)=\"onDragStart(childPath(i), $event)\"\n (dragend)=\"dragFinished.emit()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n } @empty {\n <div class=\"dz-empty\">empty — drop fields here</div>\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isOver(childPath(container().children.length))\"\n (dragover)=\"onDragOver(childPath(container().children.length), undefined, $event)\"\n (drop)=\"onDrop(childPath(container().children.length), undefined, $event)\"\n ></div>\n </div>\n }\n } @else {\n <div class=\"dz-leaf\" inert>\n <mform-node [node]=\"n\" [engine]=\"engine()\" [tick]=\"0\" />\n </div>\n }\n </div>\n `,\n})\nexport class DesignerNodeComponent {\n readonly node = input.required<FieldNode>();\n readonly path = input.required<NodePath>();\n readonly engine = input.required<FormEngine>();\n readonly selected = input<NodePath | null>(null);\n /** True while something is being dragged (reveals the drop zones). */\n readonly dragging = input<boolean>(false);\n /** Id of the drop zone currently hovered. */\n readonly activeDrop = input<string | null>(null);\n\n readonly selectNode = output<NodePath>();\n readonly nodeDragStart = output<NodePath>();\n readonly dragOverTarget = output<DropTarget>();\n readonly dropOnTarget = output<DropTarget>();\n readonly dragFinished = output<void>();\n\n readonly activeTab = signal(0);\n\n container(): ContainerField {\n return this.node() as ContainerField;\n }\n\n chip(): string {\n const node = this.node();\n const label = node.label ?? node.key;\n return `${label} · ${node.type}`;\n }\n\n isSelected(): boolean {\n const selected = this.selected();\n return selected !== null && selected.join('.') === this.path().join('.');\n }\n\n childPath(index: number): NodePath {\n return [...this.path(), index];\n }\n\n columnsTemplate(): string {\n const columns = this.container().columns ?? [];\n const total = columns.reduce((sum, c) => sum + c.width, 0) || 12;\n return columns.map((c) => `${((c.width / total) * 100).toFixed(3)}fr`).join(' ');\n }\n\n onSelect(event: Event): void {\n event.stopPropagation();\n this.selectNode.emit(this.path());\n }\n\n setTab(index: number, event: Event): void {\n event.stopPropagation();\n this.activeTab.set(index);\n }\n\n // -- drag and drop --------------------------------------------------------\n\n isOver(path: NodePath, column?: number): boolean {\n return this.activeDrop() === dropId({ path, column });\n }\n\n onDragStart(path: NodePath, event: Event): void {\n event.stopPropagation();\n this.nodeDragStart.emit(path);\n }\n\n onDragOver(path: NodePath, column: number | undefined, event: DragEvent): void {\n if (!this.dragging()) return;\n event.preventDefault();\n event.stopPropagation();\n this.dragOverTarget.emit({ path, column });\n }\n\n onDrop(path: NodePath, column: number | undefined, event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dropOnTarget.emit({ path, column });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type {\n Condition,\n ContainerField,\n FieldNode,\n FieldOption,\n FormSchema,\n InputField,\n StaticField,\n ValidatorSpec,\n} from '@mosaicoo/form-core';\nimport { collectInputs } from '@mosaicoo/form-core';\n\n/** Patch emitted towards the shell (applied via core `updateNode`). */\nexport interface InspectorPatch {\n patch: Partial<FieldNode>;\n}\n\n/**\n * Property panel of the selected node. Emits immutable patches — the shell\n * owns the document, history and validation.\n */\n@Component({\n selector: 'mform-inspector',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @let n = node();\n <div class=\"dz-inspector\">\n <h3>{{ n.type }} <code>{{ n.key }}</code></h3>\n\n <label class=\"dz-prop\">\n <span>Key</span>\n <input type=\"text\" [value]=\"n.key\" (change)=\"patchText('key', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Label</span>\n <input type=\"text\" [value]=\"n.label ?? ''\" (change)=\"patchText('label', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Description</span>\n <input type=\"text\" [value]=\"n.description ?? ''\" (change)=\"patchText('description', $event)\" />\n </label>\n\n @if (n.kind === 'input') {\n <label class=\"dz-prop\">\n <span>Placeholder</span>\n <input type=\"text\" [value]=\"field().placeholder ?? ''\" (change)=\"patchText('placeholder', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Default value</span>\n <input type=\"text\" [value]=\"defaultValueText()\" (change)=\"patchDefault($event)\" />\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"isRequired()\" (change)=\"toggleRequired($event)\" />\n <span>Required</span>\n </label>\n\n <details class=\"dz-section\" open>\n <summary>Validation</summary>\n <label class=\"dz-prop\"><span>Min length</span>\n <input type=\"number\" [value]=\"validatorValue('minLength')\" (change)=\"patchValidator('minLength', $event)\" /></label>\n <label class=\"dz-prop\"><span>Max length</span>\n <input type=\"number\" [value]=\"validatorValue('maxLength')\" (change)=\"patchValidator('maxLength', $event)\" /></label>\n <label class=\"dz-prop\"><span>Min</span>\n <input type=\"number\" [value]=\"validatorValue('min')\" (change)=\"patchValidator('min', $event)\" /></label>\n <label class=\"dz-prop\"><span>Max</span>\n <input type=\"number\" [value]=\"validatorValue('max')\" (change)=\"patchValidator('max', $event)\" /></label>\n <label class=\"dz-prop\"><span>Pattern (regex)</span>\n <input type=\"text\" [value]=\"patternValue()\" (change)=\"patchPattern($event)\" /></label>\n </details>\n\n @if (hasOptions()) {\n <details class=\"dz-section\" open>\n <summary>Options</summary>\n @for (option of field().options ?? []; track $index; let i = $index) {\n <div class=\"dz-option-row\">\n <input type=\"text\" placeholder=\"Label\" [value]=\"option.label\"\n (change)=\"patchOption(i, 'label', $event)\" />\n <input type=\"text\" placeholder=\"Value\" [value]=\"option.value\"\n (change)=\"patchOption(i, 'value', $event)\" />\n <button type=\"button\" (click)=\"removeOption(i)\" aria-label=\"Remove option\">✕</button>\n </div>\n }\n <button type=\"button\" class=\"dz-add\" (click)=\"addOption()\">+ Option</button>\n </details>\n }\n }\n\n @if (n.kind === 'static' && n.type === 'content') {\n <label class=\"dz-prop\">\n <span>Content (HTML)</span>\n <textarea rows=\"5\" [value]=\"static_().content ?? ''\" (change)=\"patchText('content', $event)\"></textarea>\n </label>\n }\n\n @if (n.kind === 'container' && n.type === 'columns') {\n <label class=\"dz-prop\">\n <span>Column widths (of 12, comma-separated)</span>\n <input type=\"text\" [value]=\"columnWidths()\" (change)=\"patchColumnWidths($event)\" />\n </label>\n }\n\n <details class=\"dz-section\">\n <summary>Visibility</summary>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"n.hidden === true\" (change)=\"patchFlag('hidden', $event)\" />\n <span>Hidden</span>\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"n.disabled === true\" (change)=\"patchFlag('disabled', $event)\" />\n <span>Disabled</span>\n </label>\n <label class=\"dz-prop\">\n <span>Show when field…</span>\n <select [value]=\"simpleCondition()?.field ?? ''\" (change)=\"patchConditionField($event)\">\n <option value=\"\">(always visible)</option>\n @for (path of otherInputPaths(); track path) {\n <option [value]=\"path\" [selected]=\"simpleCondition()?.field === path\">{{ path }}</option>\n }\n </select>\n </label>\n @if (simpleCondition()) {\n <label class=\"dz-prop\">\n <span>…equals value</span>\n <input type=\"text\" [value]=\"conditionValueText()\" (change)=\"patchConditionValue($event)\" />\n </label>\n }\n <label class=\"dz-prop\">\n <span>Show when expression (advanced)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: total > 1000 && status == 'ok'\"\n [value]=\"conditionExpression()\"\n (change)=\"patchConditionExpression($event)\"\n />\n </label>\n </details>\n\n @if (n.kind === 'input') {\n <details class=\"dz-section\">\n <summary>Advanced</summary>\n <label class=\"dz-prop\">\n <span>Calculated value (expression)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: qty * price\"\n [value]=\"field().calculate ?? ''\"\n (change)=\"patchCalculate($event)\"\n />\n </label>\n <label class=\"dz-prop\">\n <span>Input mask (0=digit A=letter S=any)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: 000.000.000-00\"\n [value]=\"field().format?.mask ?? ''\"\n (change)=\"patchMask($event)\"\n />\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"field().multiple === true\" (change)=\"patchMultiple($event)\" />\n <span>Multiple values</span>\n </label>\n </details>\n\n <details class=\"dz-section\">\n <summary>Options source</summary>\n <label class=\"dz-prop\">\n <span>Source</span>\n <select [value]=\"sourceKind()\" (change)=\"patchSourceKind($event)\">\n <option value=\"\">Static list</option>\n <option value=\"provider\" [selected]=\"sourceKind() === 'provider'\">Host provider</option>\n <option value=\"remote\" [selected]=\"sourceKind() === 'remote'\">Remote URL</option>\n </select>\n </label>\n @if (sourceKind() === 'provider') {\n <label class=\"dz-prop\">\n <span>Provider name</span>\n <input type=\"text\" [value]=\"providerName()\" (change)=\"patchProviderName($event)\" />\n </label>\n }\n @if (sourceKind() === 'remote') {\n <label class=\"dz-prop\">\n <span>URL</span>\n <input type=\"text\" [value]=\"remoteUrl()\" (change)=\"patchRemoteUrl($event)\" />\n </label>\n }\n @if (sourceKind()) {\n <label class=\"dz-prop\">\n <span>Refresh on (field path or \"data\")</span>\n <input type=\"text\" [value]=\"refreshOn()\" (change)=\"patchRefreshOn($event)\" />\n </label>\n }\n </details>\n }\n\n <!-- Type-specific configuration for CUSTOM components: the host reads\n these from field.props (e.g. a board's columns, a chart's series). -->\n <details class=\"dz-section\" [open]=\"hasProps()\">\n <summary>Type settings (props)</summary>\n <label class=\"dz-prop\">\n <span>JSON passed to the field component</span>\n <textarea\n rows=\"5\"\n spellcheck=\"false\"\n [value]=\"propsText()\"\n (change)=\"patchProps($event)\"\n ></textarea>\n </label>\n @if (propsError()) {\n <p class=\"dz-import-error\" role=\"alert\">{{ propsError() }}</p>\n }\n </details>\n </div>\n `,\n})\nexport class InspectorComponent {\n readonly node = input.required<FieldNode>();\n readonly schema = input.required<FormSchema>();\n readonly nodePatch = output<InspectorPatch>();\n\n field(): InputField {\n return this.node() as InputField;\n }\n\n static_(): StaticField {\n return this.node() as StaticField;\n }\n\n hasOptions(): boolean {\n return ['select', 'radio', 'checkbox-group'].includes(this.node().type);\n }\n\n readonly otherInputPaths = computed(() =>\n collectInputs(this.schema())\n .map((entry) => entry.path)\n .filter((path) => !path.includes('*')),\n );\n\n private emitPatch(patch: Partial<FieldNode>): void {\n this.nodePatch.emit({ patch });\n }\n\n private inputValue(event: Event): string {\n return (event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n }\n\n patchText(member: 'key' | 'label' | 'description' | 'placeholder' | 'content', event: Event): void {\n const value = this.inputValue(event).trim();\n if (member === 'key' && value === '') return; // key can never be emptied\n this.emitPatch({ [member]: value === '' ? undefined : value } as Partial<FieldNode>);\n }\n\n patchFlag(member: 'hidden' | 'disabled', event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.emitPatch({ [member]: checked ? true : undefined } as Partial<FieldNode>);\n }\n\n defaultValueText(): string {\n const value = this.field().defaultValue;\n return value === undefined || value === null ? '' : String(value);\n }\n\n patchDefault(event: Event): void {\n const raw = this.inputValue(event);\n if (raw === '') {\n this.emitPatch({ defaultValue: undefined } as Partial<FieldNode>);\n return;\n }\n const field = this.field();\n let value: unknown = raw;\n if (field.dataType === 'number') value = Number(raw);\n if (field.dataType === 'boolean') value = raw === 'true';\n this.emitPatch({ defaultValue: value } as Partial<FieldNode>);\n }\n\n // -- validators -----------------------------------------------------------\n\n private validators(): ValidatorSpec[] {\n return this.field().validators ?? [];\n }\n\n isRequired(): boolean {\n return this.validators().some((v) => v.type === 'required');\n }\n\n toggleRequired(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const rest = this.validators().filter((v) => v.type !== 'required');\n this.emitValidators(checked ? [{ type: 'required' }, ...rest] : rest);\n }\n\n validatorValue(type: 'minLength' | 'maxLength' | 'min' | 'max'): string {\n const spec = this.validators().find((v) => v.type === type);\n return spec && 'value' in spec ? String(spec.value) : '';\n }\n\n patchValidator(type: 'minLength' | 'maxLength' | 'min' | 'max', event: Event): void {\n const raw = this.inputValue(event);\n const rest = this.validators().filter((v) => v.type !== type);\n this.emitValidators(raw === '' ? rest : [...rest, { type, value: Number(raw) }]);\n }\n\n patternValue(): string {\n const spec = this.validators().find((v) => v.type === 'pattern');\n return spec && 'value' in spec ? String(spec.value) : '';\n }\n\n patchPattern(event: Event): void {\n const raw = this.inputValue(event);\n const rest = this.validators().filter((v) => v.type !== 'pattern');\n this.emitValidators(raw === '' ? rest : [...rest, { type: 'pattern', value: raw }]);\n }\n\n private emitValidators(validators: ValidatorSpec[]): void {\n this.emitPatch({ validators: validators.length ? validators : undefined } as Partial<FieldNode>);\n }\n\n // -- options --------------------------------------------------------------\n\n patchOption(index: number, member: 'label' | 'value', event: Event): void {\n const options = [...(this.field().options ?? [])];\n options[index] = { ...options[index]!, [member]: this.inputValue(event) };\n this.emitPatch({ options } as Partial<FieldNode>);\n }\n\n addOption(): void {\n const options = [...(this.field().options ?? [])];\n options.push({ label: `Option ${options.length + 1}`, value: `option${options.length + 1}` });\n this.emitPatch({ options } as Partial<FieldNode>);\n }\n\n removeOption(index: number): void {\n const options = (this.field().options ?? []).filter((_, i) => i !== index);\n this.emitPatch({ options: options.length ? options : undefined } as Partial<FieldNode>);\n }\n\n // -- columns --------------------------------------------------------------\n\n columnWidths(): string {\n return ((this.node() as ContainerField).columns ?? []).map((c) => c.width).join(', ');\n }\n\n patchColumnWidths(event: Event): void {\n const container = this.node() as ContainerField;\n const widths = this.inputValue(event)\n .split(',')\n .map((part) => Number(part.trim()))\n .filter((width) => Number.isFinite(width) && width > 0);\n if (widths.length === 0) return;\n const existing = container.columns ?? [];\n const columns = widths.map((width, i) => ({\n width,\n children: existing[i]?.children ?? [],\n }));\n // children in dropped columns are re-attached to the last remaining one\n for (let i = widths.length; i < existing.length; i++) {\n columns[columns.length - 1]!.children.push(...existing[i]!.children);\n }\n this.emitPatch({ columns } as Partial<FieldNode>);\n }\n\n // -- conditional ----------------------------------------------------------\n\n simpleCondition(): Extract<Condition, { field: string }> | null {\n const condition = this.node().conditional;\n return condition && 'field' in condition ? condition : null;\n }\n\n conditionExpression(): string {\n const condition = this.node().conditional;\n return condition && 'expression' in condition ? condition.expression : '';\n }\n\n conditionValueText(): string {\n const value = this.simpleCondition()?.value;\n return value === undefined || value === null ? '' : String(value);\n }\n\n patchConditionField(event: Event): void {\n const field = this.inputValue(event);\n if (field === '') {\n this.emitPatch({ conditional: undefined });\n return;\n }\n const current = this.simpleCondition();\n const conditional: Condition = {\n show: current?.show ?? true,\n op: current?.op ?? 'eq',\n field,\n value: current?.value ?? '',\n };\n this.emitPatch({ conditional });\n }\n\n patchConditionValue(event: Event): void {\n const current = this.simpleCondition();\n if (!current) return;\n const raw = this.inputValue(event);\n const value: unknown = raw === 'true' ? true : raw === 'false' ? false : raw;\n this.emitPatch({ conditional: { ...current, value } });\n }\n\n patchConditionExpression(event: Event): void {\n const expression = this.inputValue(event).trim();\n if (expression === '') {\n // clearing the expression keeps a simple condition, if one existed\n this.emitPatch({ conditional: this.simpleCondition() ?? undefined });\n return;\n }\n this.emitPatch({ conditional: { show: true, expression } });\n }\n\n // -- advanced (calculate / mask) ------------------------------------------\n\n patchCalculate(event: Event): void {\n const expression = this.inputValue(event).trim();\n this.emitPatch({ calculate: expression === '' ? undefined : expression } as Partial<FieldNode>);\n }\n\n patchMask(event: Event): void {\n const mask = this.inputValue(event).trim();\n this.emitPatch({ format: mask === '' ? undefined : { mask } } as Partial<FieldNode>);\n }\n\n patchMultiple(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.emitPatch({\n multiple: checked ? true : undefined,\n dataType: checked ? 'array' : 'string',\n } as Partial<FieldNode>);\n }\n\n // -- options source -------------------------------------------------------\n\n sourceKind(): '' | 'provider' | 'remote' {\n return this.field().optionsSource?.type ?? '';\n }\n\n providerName(): string {\n const source = this.field().optionsSource;\n return source?.type === 'provider' ? source.name : '';\n }\n\n remoteUrl(): string {\n const source = this.field().optionsSource;\n return source?.type === 'remote' ? source.url : '';\n }\n\n refreshOn(): string {\n return this.field().optionsSource?.refreshOn ?? '';\n }\n\n patchSourceKind(event: Event): void {\n const kind = this.inputValue(event);\n if (kind === 'provider') {\n this.emitPatch({\n optionsSource: { type: 'provider', name: this.providerName() || this.field().key },\n } as Partial<FieldNode>);\n } else if (kind === 'remote') {\n this.emitPatch({\n optionsSource: { type: 'remote', url: this.remoteUrl() },\n } as Partial<FieldNode>);\n } else {\n this.emitPatch({ optionsSource: undefined } as Partial<FieldNode>);\n }\n }\n\n patchProviderName(event: Event): void {\n const name = this.inputValue(event).trim();\n if (name === '') return;\n this.emitPatch({\n optionsSource: { ...this.field().optionsSource, type: 'provider', name },\n } as Partial<FieldNode>);\n }\n\n patchRemoteUrl(event: Event): void {\n const url = this.inputValue(event).trim();\n this.emitPatch({\n optionsSource: { ...this.field().optionsSource, type: 'remote', url },\n } as Partial<FieldNode>);\n }\n\n patchRefreshOn(event: Event): void {\n const source = this.field().optionsSource;\n if (!source) return;\n const refreshOn = this.inputValue(event).trim();\n const next = { ...source };\n if (refreshOn === '') delete next.refreshOn;\n else next.refreshOn = refreshOn;\n this.emitPatch({ optionsSource: next } as Partial<FieldNode>);\n }\n\n // -- props (type-specific settings for custom components) -----------------\n\n readonly propsError = signal('');\n\n hasProps(): boolean {\n return Object.keys(this.node().props ?? {}).length > 0;\n }\n\n propsText(): string {\n const props = this.node().props;\n return props && Object.keys(props).length > 0 ? JSON.stringify(props, null, 2) : '';\n }\n\n patchProps(event: Event): void {\n const raw = this.inputValue(event).trim();\n if (raw === '') {\n this.propsError.set('');\n this.emitPatch({ props: undefined });\n return;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n this.propsError.set('Props must be a JSON object.');\n return;\n }\n this.propsError.set('');\n this.emitPatch({ props: parsed as Record<string, unknown> });\n } catch (error) {\n this.propsError.set('Invalid JSON: ' + String(error instanceof Error ? error.message : error));\n }\n }\n}\n\n/** Re-export so the shell can type option edits without a deep import. */\nexport type { FieldOption };\n","import type { FieldNode, FormSchema } from '@mosaicoo/form-core';\nimport { generateKey } from '@mosaicoo/form-core';\n\n/**\n * Palette catalog: the node factories the Designer offers. Hosts can extend\n * the palette via the `extraCatalog` input of `<mform-designer>` — entries\n * here stay generic (no domain assumptions).\n */\n\nexport interface CatalogEntry {\n /** Field `type` produced (also used to key custom renderers). */\n type: string;\n label: string;\n /** Short glyph shown in the palette. */\n icon: string;\n create(schema: FormSchema): FieldNode;\n}\n\nexport interface CatalogGroup {\n label: string;\n entries: CatalogEntry[];\n}\n\nfunction input(\n type: string,\n dataType: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array',\n label: string,\n extra?: Partial<Extract<FieldNode, { kind: 'input' }>>,\n): (schema: FormSchema) => FieldNode {\n return (schema) => ({\n kind: 'input',\n key: generateKey(schema, type),\n type,\n label,\n dataType,\n ...extra,\n });\n}\n\nexport const DEFAULT_CATALOG: CatalogGroup[] = [\n {\n label: 'Basic',\n entries: [\n { type: 'text', label: 'Text', icon: 'Aa', create: input('text', 'string', 'Text') },\n { type: 'textarea', label: 'Text area', icon: '¶', create: input('textarea', 'string', 'Text area') },\n { type: 'number', label: 'Number', icon: '#', create: input('number', 'number', 'Number') },\n { type: 'currency', label: 'Currency', icon: '$', create: input('currency', 'number', 'Currency') },\n { type: 'checkbox', label: 'Checkbox', icon: '☑', create: input('checkbox', 'boolean', 'Checkbox') },\n { type: 'email', label: 'Email', icon: '@', create: input('email', 'string', 'Email', { validators: [{ type: 'email' }] }) },\n { type: 'phone', label: 'Phone', icon: '☎', create: input('phone', 'string', 'Phone') },\n { type: 'password', label: 'Password', icon: '••', create: input('password', 'string', 'Password') },\n ],\n },\n {\n label: 'Choices',\n entries: [\n {\n type: 'select', label: 'Select', icon: '▾',\n create: (s) => ({ ...input('select', 'string', 'Select')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n {\n type: 'radio', label: 'Radio', icon: '◉',\n create: (s) => ({ ...input('radio', 'string', 'Radio')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n {\n type: 'checkbox-group', label: 'Checkbox group', icon: '☷',\n create: (s) => ({ ...input('checkbox-group', 'object', 'Checkbox group')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n { type: 'tags', label: 'Tags', icon: '⌗', create: input('tags', 'array', 'Tags') },\n {\n type: 'reference', label: 'Reference', icon: '⌕',\n create: (s) => ({\n ...input('reference', 'string', 'Reference')(s),\n optionsSource: { type: 'provider', name: 'reference' },\n } as FieldNode),\n },\n ],\n },\n {\n label: 'Date & files',\n entries: [\n { type: 'datetime', label: 'Date & time', icon: '📅', create: input('datetime', 'date', 'Date & time') },\n { type: 'day', label: 'Date', icon: '▦', create: input('day', 'string', 'Date') },\n { type: 'time', label: 'Time', icon: '◷', create: input('time', 'string', 'Time') },\n { type: 'file', label: 'File', icon: '📎', create: input('file', 'array', 'File') },\n ],\n },\n {\n label: 'Layout',\n entries: [\n {\n type: 'panel', label: 'Panel', icon: '▭',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'panel'), type: 'panel',\n dataScope: 'inherit', label: 'Panel', children: [] }),\n },\n {\n type: 'columns', label: 'Columns', icon: '▥',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'columns'), type: 'columns',\n dataScope: 'inherit', children: [], columns: [\n { width: 6, children: [] }, { width: 6, children: [] },\n ] }),\n },\n {\n type: 'tabs', label: 'Tabs', icon: '⧉',\n create: (s) => {\n const key = generateKey(s, 'tabs');\n return { kind: 'container', key, type: 'tabs', dataScope: 'inherit', children: [\n { kind: 'container', key: `${key}-tab-1`, type: 'panel', dataScope: 'inherit', label: 'Tab 1', children: [] },\n { kind: 'container', key: `${key}-tab-2`, type: 'panel', dataScope: 'inherit', label: 'Tab 2', children: [] },\n ] };\n },\n },\n {\n type: 'accordion', label: 'Accordion', icon: '☰',\n create: (s) => {\n const key = generateKey(s, 'accordion');\n return { kind: 'container', key, type: 'accordion', dataScope: 'inherit', children: [\n { kind: 'container', key: `${key}-section-1`, type: 'panel', dataScope: 'inherit', label: 'Section 1', children: [] },\n { kind: 'container', key: `${key}-section-2`, type: 'panel', dataScope: 'inherit', label: 'Section 2', children: [] },\n ] };\n },\n },\n {\n type: 'group', label: 'Data group', icon: '⧈',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'group'), type: 'group',\n dataScope: 'nested', label: 'Group', children: [] }),\n },\n {\n type: 'datagrid', label: 'Data grid', icon: '☰',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'datagrid'), type: 'datagrid',\n dataScope: 'array', label: 'Data grid', children: [] }),\n },\n ],\n },\n {\n label: 'Static',\n entries: [\n {\n type: 'content', label: 'Content', icon: '¶¶',\n create: (s) => ({ kind: 'static', key: generateKey(s, 'content'), type: 'content',\n content: '<p>Content</p>' }),\n },\n {\n type: 'button', label: 'Submit button', icon: '⏎',\n create: (s) => ({ kind: 'static', key: generateKey(s, 'button'), type: 'button',\n label: 'Submit', props: { action: 'submit' } }),\n },\n ],\n },\n];\n","import type { FieldNode } from '@mosaicoo/form-core';\n\n/**\n * Reusable blocks: a named node subtree (an address group, a payment panel,\n * a compliance section) that can be dropped into any form. Blocks are plain\n * schema fragments — serializable, portable and free of runtime state.\n *\n * The designer keeps them locally by default; hosts that want blocks shared\n * across users bind `[blocks]` and persist `(blocksChanged)` themselves.\n */\n\nexport interface FormBlock {\n id: string;\n label: string;\n /** Schema subtree; keys are regenerated on insert to stay unique. */\n node: FieldNode;\n}\n\nconst STORAGE_KEY = 'mform-designer-blocks';\n\nexport function loadBlocks(storage: Storage | null): FormBlock[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(STORAGE_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as FormBlock[]) : [];\n } catch {\n return [];\n }\n}\n\nexport function saveBlocks(storage: Storage | null, blocks: FormBlock[]): void {\n try {\n storage?.setItem(STORAGE_KEY, JSON.stringify(blocks));\n } catch {\n /* storage unavailable — blocks stay in memory for this session */\n }\n}\n","/**\n * Every visible string of the designer, so hosts can localize the authoring\n * experience the same way they already localize the runtime. Override\n * partially — unset entries fall back to English.\n *\n * The palette itself is DATA: translate `DEFAULT_CATALOG` (or supply your own\n * groups) and pass it through the `[catalog]` input.\n */\nexport interface DesignerLabels {\n undo: string;\n redo: string;\n moveUp: string;\n moveDown: string;\n nest: string;\n unnest: string;\n duplicate: string;\n delete: string;\n saveBlock: string;\n viewport: string;\n workspace: string;\n panels: string;\n presets: string;\n resetLayout: string;\n moveLeft: string;\n moveRight: string;\n hidePanel: string;\n import: string;\n export: string;\n preview: string;\n design: string;\n cancel: string;\n close: string;\n importTitle: string;\n importPlaceholder: string;\n importError: string;\n exportTitle: string;\n canvasEmpty: string;\n selectField: string;\n testData: string;\n panelFields: string;\n panelStructure: string;\n panelProperties: string;\n noFields: string;\n}\n\nexport const DESIGNER_LABELS_EN: DesignerLabels = {\n undo: 'Undo (Ctrl+Z)',\n redo: 'Redo (Ctrl+Y)',\n moveUp: 'Move up (Alt+↑)',\n moveDown: 'Move down (Alt+↓)',\n nest: 'Nest into the container above (Alt+→)',\n unnest: 'Move out of the container (Alt+←)',\n duplicate: 'Duplicate (Ctrl+D)',\n delete: 'Delete (Del)',\n saveBlock: 'Save as reusable block',\n viewport: 'Preview width',\n workspace: 'Workspace',\n panels: 'Panels',\n presets: 'Presets',\n resetLayout: 'Reset layout',\n moveLeft: 'Move left',\n moveRight: 'Move right',\n hidePanel: 'Hide panel',\n import: 'Import',\n export: 'Export',\n preview: 'Preview',\n design: 'Design',\n cancel: 'Cancel',\n close: 'Close',\n importTitle: 'Import definition (native schema or supported formats)',\n importPlaceholder: '{\"version\":1,\"fields\":[…]} or a legacy definition',\n importError: 'Could not import: ',\n exportTitle: 'Schema JSON',\n canvasEmpty: 'Click a field in the palette — or drag it here — to start building.',\n selectField: 'Select a field to edit its properties.',\n testData: 'Test data',\n panelFields: 'Fields',\n panelStructure: 'Structure',\n panelProperties: 'Properties',\n noFields: 'no fields yet',\n};\n","/**\n * Designer workspace layout.\n *\n * Panels are dockable like in professional tools: each one can sit on the\n * left, on the right, or be hidden — the canvas always keeps the center. The\n * arrangement is a plain serializable object so hosts can persist it per user\n * (the designer also remembers it locally by default).\n */\n\nexport type DockSide = 'left' | 'right' | 'hidden';\n\n/** Panels that can be docked around the canvas. */\nexport type PanelId = 'palette' | 'structure' | 'properties';\n\nexport interface WorkspaceLayout {\n palette: DockSide;\n structure: DockSide;\n properties: DockSide;\n /** Width of each dock rail, in pixels. */\n leftWidth: number;\n rightWidth: number;\n}\n\nexport const DEFAULT_LAYOUT: WorkspaceLayout = {\n palette: 'left',\n structure: 'left',\n properties: 'right',\n leftWidth: 240,\n rightWidth: 280,\n};\n\nexport interface WorkspacePreset {\n id: string;\n label: string;\n layout: WorkspaceLayout;\n}\n\n/** Ready-made arrangements offered in the workspace menu. */\nexport const WORKSPACE_PRESETS: WorkspacePreset[] = [\n { id: 'default', label: 'Default (fields left, properties right)', layout: DEFAULT_LAYOUT },\n {\n id: 'authoring',\n label: 'Authoring (everything left)',\n layout: { ...DEFAULT_LAYOUT, properties: 'left', leftWidth: 300 },\n },\n {\n id: 'inspect',\n label: 'Inspect (structure + properties right)',\n layout: { ...DEFAULT_LAYOUT, structure: 'right', properties: 'right', rightWidth: 320 },\n },\n {\n id: 'canvas',\n label: 'Canvas only (panels hidden)',\n layout: { ...DEFAULT_LAYOUT, palette: 'hidden', structure: 'hidden', properties: 'hidden' },\n },\n];\n\nexport const PANEL_LABELS: Record<PanelId, string> = {\n palette: 'Fields',\n structure: 'Structure',\n properties: 'Properties',\n};\n\nconst STORAGE_KEY = 'mform-designer-layout';\n\nexport function loadLayout(storage: Storage | null): WorkspaceLayout {\n if (!storage) return DEFAULT_LAYOUT;\n try {\n const raw = storage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULT_LAYOUT;\n const parsed = JSON.parse(raw) as Partial<WorkspaceLayout>;\n return { ...DEFAULT_LAYOUT, ...parsed };\n } catch {\n return DEFAULT_LAYOUT;\n }\n}\n\nexport function saveLayout(storage: Storage | null, layout: WorkspaceLayout): void {\n try {\n storage?.setItem(STORAGE_KEY, JSON.stringify(layout));\n } catch {\n /* storage unavailable (private mode, SSR) — layout stays in memory */\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { JsonPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n createFormEngine,\n duplicateNode,\n generateKey,\n getNodeAt,\n insertNode,\n moveNode,\n parentOf,\n removeNode,\n updateNode,\n validateSchema,\n type FieldNode,\n type FormEngine,\n type FormSchema,\n type NodePath,\n type SchemaDiagnostic,\n} from '@mosaicoo/form-core';\nimport { createLegacyImporter, importForm } from '@mosaicoo/form-core/interop';\nimport { FormRendererComponent } from '@mosaicoo/form-angular';\nimport { DesignerNodeComponent } from './designer-node.component.js';\nimport { InspectorComponent, type InspectorPatch } from './inspector.component.js';\nimport { DEFAULT_CATALOG, type CatalogEntry, type CatalogGroup } from './field-catalog.js';\nimport { loadBlocks, saveBlocks, type FormBlock } from './blocks.js';\nimport { DESIGNER_LABELS_EN, type DesignerLabels } from './designer-labels.js';\nimport { dropId, type DropTarget } from './drag-drop.js';\nimport {\n DEFAULT_LAYOUT,\n PANEL_LABELS,\n WORKSPACE_PRESETS,\n loadLayout,\n saveLayout,\n type DockSide,\n type PanelId,\n type WorkspaceLayout,\n} from './workspace.js';\n\nconst EMPTY_SCHEMA: FormSchema = { version: 1, fields: [] };\nconst HISTORY_LIMIT = 50;\n\n/** True when `target` is `from` itself or somewhere inside it. */\nfunction isSameOrInside(from: NodePath, target: NodePath): boolean {\n return from.every((segment, index) => target[index] === segment);\n}\n\n/**\n * A move removes before it inserts: when the source sits before the target\n * under the same parent, every index after it shifts down by one.\n */\nfunction adjustAfterRemoval(from: NodePath, target: NodePath): NodePath {\n const parentDepth = from.length - 1;\n const sameParent = from.slice(0, parentDepth).every((s, i) => target[i] === s);\n if (!sameParent || target.length < from.length) return target;\n const adjusted = [...target];\n const fromIndex = from[parentDepth]!;\n const targetIndex = adjusted[parentDepth]!;\n if (targetIndex > fromIndex) adjusted[parentDepth] = targetIndex - 1;\n return adjusted;\n}\n\n/** Deep copy of a block with fresh keys, so it can be inserted repeatedly. */\nfunction rekeyBlock(node: FieldNode, schema: FormSchema): FieldNode {\n const copy = JSON.parse(JSON.stringify(node)) as FieldNode;\n const assign = (target: FieldNode) => {\n target.key = generateKey(schema, target.key);\n if (target.kind === 'container') target.children.forEach(assign);\n };\n assign(copy);\n return copy;\n}\n\n/**\n * `<mform-designer>` — visual authoring of form schemas.\n *\n * The designer edits a DOCUMENT (the schema): every change goes through the\n * core's immutable edit operations, feeding undo/redo and `schemaChanged`.\n * Persistence, publishing and permissions belong to the host.\n */\n@Component({\n selector: 'mform-designer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n DesignerNodeComponent,\n InspectorComponent,\n FormRendererComponent,\n JsonPipe,\n NgTemplateOutlet,\n ],\n styleUrls: ['./designer-theme.css'],\n template: `\n <div class=\"dz-shell\" (keydown)=\"onKeydown($event)\">\n <header class=\"dz-toolbar\">\n <div class=\"dz-tools\">\n <button type=\"button\" (click)=\"undo()\" [disabled]=\"past().length === 0\" [title]=\"labels().undo\">↶</button>\n <button type=\"button\" (click)=\"redo()\" [disabled]=\"future().length === 0\" [title]=\"labels().redo\">↷</button>\n <span class=\"dz-sep\"></span>\n <button type=\"button\" (click)=\"moveSelected(-1)\" [disabled]=\"!selected()\" [title]=\"labels().moveUp\">↑</button>\n <button type=\"button\" (click)=\"moveSelected(1)\" [disabled]=\"!selected()\" [title]=\"labels().moveDown\">↓</button>\n <button type=\"button\" (click)=\"unnestSelected()\" [disabled]=\"!canUnnest()\" [title]=\"labels().unnest\">⇤</button>\n <button type=\"button\" (click)=\"nestSelected()\" [disabled]=\"!canNest()\" [title]=\"labels().nest\">⇥</button>\n <button type=\"button\" (click)=\"duplicateSelected()\" [disabled]=\"!selected()\" [title]=\"labels().duplicate\">⧉</button>\n <button type=\"button\" (click)=\"removeSelected()\" [disabled]=\"!selected()\" [title]=\"labels().delete\">🗑</button>\n <button type=\"button\" (click)=\"saveAsBlock()\" [disabled]=\"!selected()\" [title]=\"labels().saveBlock\">⊞</button>\n </div>\n <div class=\"dz-tools\">\n @if (diagnostics().length > 0) {\n <button type=\"button\" class=\"dz-diag-badge\" (click)=\"showDiagnostics.set(!showDiagnostics())\">\n ⚠ {{ diagnostics().length }}\n </button>\n }\n <div class=\"dz-menu\">\n <button type=\"button\" (click)=\"workspaceMenu.set(!workspaceMenu())\" [title]=\"labels().workspace\">\n ▦ {{ labels().workspace }}\n </button>\n @if (workspaceMenu()) {\n <div class=\"dz-menu-panel\" role=\"menu\">\n <span class=\"dz-menu-title\">{{ labels().panels }}</span>\n @for (panel of panelIds; track panel) {\n <div class=\"dz-menu-row\">\n <span>{{ panelLabel(panel) }}</span>\n <span class=\"dz-seg\">\n @for (side of dockSides; track side) {\n <button\n type=\"button\"\n [class.is-on]=\"layout()[panel] === side\"\n (click)=\"dock(panel, side)\"\n >{{ sideLabels[side] }}</button>\n }\n </span>\n </div>\n }\n <span class=\"dz-menu-title\">{{ labels().presets }}</span>\n @for (preset of presets; track preset.id) {\n <button type=\"button\" class=\"dz-menu-item\" (click)=\"applyPreset(preset.id)\">\n {{ preset.label }}\n </button>\n }\n <button type=\"button\" class=\"dz-menu-item\" (click)=\"resetLayout()\">{{ labels().resetLayout }}</button>\n </div>\n }\n </div>\n <button type=\"button\" (click)=\"dialog.set(dialog() === 'import' ? null : 'import')\">{{ labels().import }}</button>\n <button type=\"button\" (click)=\"openExport()\">{{ labels().export }}</button>\n <button type=\"button\" class=\"dz-primary\" (click)=\"preview.set(!preview())\">\n {{ preview() ? labels().design : labels().preview }}\n </button>\n </div>\n </header>\n\n @if (showDiagnostics() && diagnostics().length > 0) {\n <div class=\"dz-diagnostics\" role=\"alert\">\n @for (diag of diagnostics(); track $index) {\n <div class=\"dz-diag\" [class.is-warning]=\"diag.severity === 'warning'\">\n <code>{{ diag.code }}</code> {{ diag.message }} <em>{{ diag.path }}</em>\n </div>\n }\n </div>\n }\n\n @if (dialog() === 'export') {\n <div class=\"dz-dialog\">\n <h4>{{ labels().exportTitle }}</h4>\n <textarea readonly rows=\"12\">{{ exportedJson() }}</textarea>\n <div class=\"dz-dialog-actions\">\n <button type=\"button\" (click)=\"dialog.set(null)\">{{ labels().close }}</button>\n </div>\n </div>\n }\n @if (dialog() === 'import') {\n <div class=\"dz-dialog\">\n <h4>{{ labels().importTitle }}</h4>\n <textarea rows=\"12\" #importArea [placeholder]=\"labels().importPlaceholder\"></textarea>\n @if (importError()) {\n <p class=\"dz-import-error\" role=\"alert\">{{ importError() }}</p>\n }\n <div class=\"dz-dialog-actions\">\n <button type=\"button\" (click)=\"dialog.set(null)\">{{ labels().cancel }}</button>\n <button type=\"button\" class=\"dz-primary\" (click)=\"doImport(importArea.value)\">{{ labels().import }}</button>\n </div>\n </div>\n }\n\n @if (preview()) {\n <div class=\"dz-preview\">\n <div class=\"dz-viewports\" role=\"group\" [attr.aria-label]=\"labels().viewport\">\n @for (option of viewports; track option.id) {\n <button\n type=\"button\"\n [class.is-on]=\"viewport() === option.id\"\n (click)=\"viewport.set(option.id)\"\n [title]=\"option.width ? option.label + ' · ' + option.width + 'px' : option.label\"\n >{{ option.icon }} {{ option.label }}</button>\n }\n </div>\n <div\n class=\"dz-preview-frame\"\n [class.is-constrained]=\"viewportWidth() !== null\"\n [style.max-width.px]=\"viewportWidth()\"\n >\n <mform-renderer [schema]=\"draft()\" (valueChanged)=\"previewData.set($event)\" />\n </div>\n <details class=\"dz-preview-data\">\n <summary>{{ labels().testData }}</summary>\n <pre>{{ previewData() | json }}</pre>\n </details>\n </div>\n } @else {\n <div\n class=\"dz-body\"\n [style.grid-template-columns]=\"bodyColumns()\"\n (pointermove)=\"onResizeMove($event)\"\n (pointerup)=\"endResize()\"\n (pointercancel)=\"endResize()\"\n >\n @if (dockedPanels('left').length > 0) {\n <aside class=\"dz-dock dz-dock-left\">\n @for (panel of dockedPanels('left'); track panel) {\n <ng-container *ngTemplateOutlet=\"panelTemplate; context: { $implicit: panel }\" />\n }\n <div\n class=\"dz-splitter dz-splitter-left\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n (pointerdown)=\"startResize('left', $event)\"\n ></div>\n </aside>\n }\n\n <main class=\"dz-canvas\" [class.is-dragging]=\"isDragging()\" (click)=\"select(null)\">\n @for (node of draft().fields; track node.key; let i = $index) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isDropTarget({ path: [i] })\"\n (dragover)=\"allowDrop({ path: [i] }, $event)\"\n (drop)=\"drop({ path: [i] }, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"node\"\n [path]=\"[i]\"\n [engine]=\"canvasEngine()\"\n [selected]=\"selected()\"\n [dragging]=\"isDragging()\"\n [activeDrop]=\"dropTarget()\"\n draggable=\"true\"\n (dragstart)=\"startNodeDrag([i], $event)\"\n (dragend)=\"endDrag()\"\n (selectNode)=\"select($event)\"\n (nodeDragStart)=\"startNodeDrag($event)\"\n (dragOverTarget)=\"allowDrop($event)\"\n (dropOnTarget)=\"drop($event)\"\n (dragFinished)=\"endDrag()\"\n />\n } @empty {\n <div class=\"dz-canvas-empty\">\n {{ labels().canvasEmpty }}\n </div>\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isDropTarget({ path: [draft().fields.length] })\"\n (dragover)=\"allowDrop({ path: [draft().fields.length] }, $event)\"\n (drop)=\"drop({ path: [draft().fields.length] }, $event)\"\n ></div>\n </main>\n\n @if (dockedPanels('right').length > 0) {\n <aside class=\"dz-dock dz-dock-right\">\n <div\n class=\"dz-splitter dz-splitter-right\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n (pointerdown)=\"startResize('right', $event)\"\n ></div>\n @for (panel of dockedPanels('right'); track panel) {\n <ng-container *ngTemplateOutlet=\"panelTemplate; context: { $implicit: panel }\" />\n }\n </aside>\n }\n </div>\n }\n </div>\n\n <!-- One template per panel, rendered into whichever dock holds it. -->\n <ng-template #panelTemplate let-panel>\n <section class=\"dz-panel\" [attr.data-panel]=\"panel\">\n <header class=\"dz-panel-head\">\n <span>{{ panelLabel(panel) }}</span>\n <span class=\"dz-panel-actions\">\n <button\n type=\"button\"\n [title]=\"panelSide(panel) === 'left' ? labels().moveRight : labels().moveLeft\"\n (click)=\"dock(panel, panelSide(panel) === 'left' ? 'right' : 'left')\"\n >{{ panelSide(panel) === 'left' ? '⇥' : '⇤' }}</button>\n <button type=\"button\" [title]=\"labels().hidePanel\" (click)=\"dock(panel, 'hidden')\">✕</button>\n </span>\n </header>\n <div class=\"dz-panel-body\">\n @switch (panel) {\n @case ('palette') {\n @for (group of catalog(); track group.label) {\n <div class=\"dz-group\">\n <button\n type=\"button\"\n class=\"dz-group-toggle\"\n [class.is-open]=\"isGroupOpen(group.label)\"\n [attr.aria-expanded]=\"isGroupOpen(group.label)\"\n (click)=\"toggleGroup(group.label)\"\n >\n <span class=\"dz-caret\" aria-hidden=\"true\">{{ isGroupOpen(group.label) ? '▾' : '▸' }}</span>\n {{ group.label }}\n <span class=\"dz-group-count\">{{ group.entries.length }}</span>\n </button>\n @if (isGroupOpen(group.label)) {\n <div class=\"dz-group-entries\">\n @for (entry of group.entries; track entry.type) {\n <div class=\"dz-palette-row\">\n <button\n type=\"button\"\n class=\"dz-palette-item\"\n draggable=\"true\"\n (dragstart)=\"startEntryDrag(entry, $event)\"\n (dragend)=\"endDrag()\"\n (click)=\"add(entry)\"\n [title]=\"'Add ' + entry.label + ' (or drag onto the canvas)'\"\n >\n <span class=\"dz-icon\">{{ entry.icon }}</span>{{ entry.label }}\n </button>\n @if (isBlockEntry(entry)) {\n <button\n type=\"button\"\n class=\"dz-block-remove\"\n (click)=\"removeBlock(blockIdOf(entry))\"\n [attr.aria-label]=\"'Remove block ' + entry.label\"\n >✕</button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n @case ('structure') {\n <div class=\"dz-tree\" role=\"tree\">\n @for (item of tree(); track item.id) {\n <button\n type=\"button\"\n role=\"treeitem\"\n class=\"dz-tree-item\"\n [class.is-selected]=\"isSelectedPath(item.path)\"\n [style.padding-left.px]=\"8 + item.depth * 14\"\n (click)=\"select(item.path)\"\n >\n {{ item.label }}\n </button>\n } @empty {\n <span class=\"dz-empty\">{{ labels().noFields }}</span>\n }\n </div>\n }\n @case ('properties') {\n @if (selectedNode(); as node) {\n <mform-inspector\n [node]=\"node\"\n [schema]=\"draft()\"\n (nodePatch)=\"applyPatch($event)\"\n />\n } @else {\n <div class=\"dz-empty dz-props-empty\">{{ labels().selectField }}</div>\n }\n }\n }\n </div>\n </section>\n </ng-template>\n `,\n})\nexport class FormDesignerComponent {\n /** Initial native schema to edit. */\n readonly schema = input<FormSchema | null>(null);\n /** Initial foreign definition (converted through importers). */\n readonly source = input<unknown>(null);\n /** Extra palette groups contributed by the host. */\n readonly extraCatalog = input<CatalogGroup[]>([]);\n /** Replaces the built-in palette (e.g. a translated DEFAULT_CATALOG). */\n readonly catalogOverride = input<CatalogGroup[] | null>(null, { alias: 'catalog' });\n /** Designer texts; partial overrides fall back to English. */\n readonly labels = input(DESIGNER_LABELS_EN, {\n transform: (value: Partial<DesignerLabels>) => ({ ...DESIGNER_LABELS_EN, ...value }),\n });\n\n /** Emitted after every committed edit (undo/redo included). */\n readonly schemaChanged = output<FormSchema>();\n\n readonly draft = signal<FormSchema>(EMPTY_SCHEMA);\n readonly past = signal<FormSchema[]>([]);\n readonly future = signal<FormSchema[]>([]);\n readonly selected = signal<NodePath | null>(null);\n readonly preview = signal(false);\n readonly previewData = signal<Record<string, unknown>>({});\n\n /** Preview viewport: the frame drives the form's container queries. */\n readonly viewport = signal<'desktop' | 'tablet' | 'mobile'>('desktop');\n readonly viewports: Array<{ id: 'desktop' | 'tablet' | 'mobile'; label: string; icon: string; width: number | null }> = [\n { id: 'desktop', label: 'Desktop', icon: '🖥', width: null },\n { id: 'tablet', label: 'Tablet', icon: '▭', width: 768 },\n { id: 'mobile', label: 'Mobile', icon: '▯', width: 375 },\n ];\n\n viewportWidth(): number | null {\n return this.viewports.find((option) => option.id === this.viewport())?.width ?? null;\n }\n readonly dialog = signal<'import' | 'export' | null>(null);\n readonly importError = signal('');\n readonly showDiagnostics = signal(false);\n\n // -- workspace ------------------------------------------------------------\n\n /** Panel arrangement; persisted locally unless the host controls it. */\n readonly layout = signal<WorkspaceLayout>(DEFAULT_LAYOUT);\n readonly workspaceMenu = signal(false);\n readonly panelIds: PanelId[] = ['palette', 'structure', 'properties'];\n readonly dockSides: DockSide[] = ['left', 'right', 'hidden'];\n readonly panelLabels = PANEL_LABELS;\n readonly sideLabels: Record<DockSide, string> = { left: '⇤', right: '⇥', hidden: '✕' };\n readonly presets = WORKSPACE_PRESETS;\n /** Collapsed palette groups (only the first stays open by default). */\n readonly openGroups = signal<Set<string>>(new Set());\n\n private readonly storage = (() => {\n try {\n return typeof localStorage === 'undefined' ? null : localStorage;\n } catch {\n return null;\n }\n })();\n\n panelLabel(panel: PanelId): string {\n const labels = this.labels();\n if (panel === 'palette') return labels.panelFields;\n if (panel === 'structure') return labels.panelStructure;\n return labels.panelProperties;\n }\n\n panelSide(panel: PanelId): DockSide {\n return this.layout()[panel];\n }\n\n dockedPanels(side: 'left' | 'right'): PanelId[] {\n const layout = this.layout();\n return this.panelIds.filter((panel) => layout[panel] === side);\n }\n\n bodyColumns(): string {\n const layout = this.layout();\n const left = this.dockedPanels('left').length > 0 ? `${layout.leftWidth}px ` : '';\n const right = this.dockedPanels('right').length > 0 ? ` ${layout.rightWidth}px` : '';\n return `${left}1fr${right}`;\n }\n\n dock(panel: PanelId, side: DockSide): void {\n this.layout.update((current) => ({ ...current, [panel]: side }));\n saveLayout(this.storage, this.layout());\n }\n\n applyPreset(id: string): void {\n const preset = WORKSPACE_PRESETS.find((p) => p.id === id);\n if (!preset) return;\n this.layout.set({ ...preset.layout });\n saveLayout(this.storage, this.layout());\n this.workspaceMenu.set(false);\n }\n\n resetLayout(): void {\n this.layout.set({ ...DEFAULT_LAYOUT });\n saveLayout(this.storage, this.layout());\n this.workspaceMenu.set(false);\n }\n\n /** Live drag state of a dock splitter. */\n private resizing: { side: 'left' | 'right'; startX: number; startWidth: number } | null = null;\n\n startResize(side: 'left' | 'right', event: PointerEvent): void {\n event.preventDefault();\n const layout = this.layout();\n this.resizing = {\n side,\n startX: event.clientX,\n startWidth: side === 'left' ? layout.leftWidth : layout.rightWidth,\n };\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n }\n\n onResizeMove(event: PointerEvent): void {\n const resizing = this.resizing;\n if (!resizing) return;\n // dragging right widens a left dock and narrows a right one\n const delta = event.clientX - resizing.startX;\n const raw = resizing.startWidth + (resizing.side === 'left' ? delta : -delta);\n const width = Math.max(160, Math.min(520, Math.round(raw)));\n this.layout.update((current) =>\n resizing.side === 'left' ? { ...current, leftWidth: width } : { ...current, rightWidth: width },\n );\n }\n\n endResize(): void {\n if (!this.resizing) return;\n this.resizing = null;\n saveLayout(this.storage, this.layout());\n }\n\n isGroupOpen(label: string): boolean {\n return this.openGroups().has(label);\n }\n\n toggleGroup(label: string): void {\n this.openGroups.update((open) => {\n const next = new Set(open);\n if (next.has(label)) next.delete(label);\n else next.add(label);\n return next;\n });\n }\n\n /** Saved blocks (host-controlled when `[blocks]` is bound). */\n readonly blocks = input<FormBlock[] | null>(null);\n readonly blocksChanged = output<FormBlock[]>();\n private readonly localBlocks = signal<FormBlock[]>([]);\n readonly effectiveBlocks = computed<FormBlock[]>(() => this.blocks() ?? this.localBlocks());\n\n /** Palette = built-ins + host extras + saved blocks as a group. */\n readonly catalog = computed<CatalogGroup[]>(() => {\n const groups = [...(this.catalogOverride() ?? DEFAULT_CATALOG), ...this.extraCatalog()];\n const blocks = this.effectiveBlocks();\n if (blocks.length > 0) {\n groups.push({\n label: 'Blocks',\n entries: blocks.map((block) => ({\n type: `block:${block.id}`,\n label: block.label,\n icon: '⊞',\n create: (schema: FormSchema) => rekeyBlock(block.node, schema),\n })),\n });\n }\n return groups;\n });\n readonly diagnostics = computed<SchemaDiagnostic[]>(() => validateSchema(this.draft()));\n readonly exportedJson = computed(() => JSON.stringify(this.draft(), null, 2));\n\n /** Disposable engine driving the canvas leaves (defaults visible). */\n readonly canvasEngine = computed<FormEngine>(() => createFormEngine(this.draft()));\n\n readonly selectedNode = computed<FieldNode | null>(() => {\n const path = this.selected();\n return path ? (getNodeAt(this.draft(), path) ?? null) : null;\n });\n\n /** Flat structure tree for navigation. */\n readonly tree = computed(() => {\n const items: Array<{ id: string; label: string; depth: number; path: NodePath }> = [];\n const visit = (nodes: FieldNode[], depth: number, prefix: NodePath) => {\n nodes.forEach((node, i) => {\n const path = [...prefix, i];\n items.push({\n id: path.join('.'),\n label: `${node.label ?? node.key} · ${node.type}`,\n depth,\n path,\n });\n if (node.kind === 'container') visit(node.children, depth + 1, path);\n });\n };\n visit(this.draft().fields, 0, []);\n return items;\n });\n\n constructor() {\n this.layout.set(loadLayout(this.storage));\n this.localBlocks.set(loadBlocks(this.storage));\n // First palette group starts expanded; the rest opens on demand.\n const first = this.catalog()[0]?.label;\n if (first) this.openGroups.set(new Set([first]));\n\n // (Re)load the document whenever the host hands a new definition in.\n effect(() => {\n const native = this.schema();\n const source = this.source();\n // Hosts often feed `schemaChanged` back into [schema] (controlled\n // usage) — the echo of our own draft must not reset history/selection.\n // `untracked` is essential: reading the draft as a dependency would make\n // every edit re-run this effect and revert the document.\n if (native && native === untracked(() => this.draft())) return;\n let initial = EMPTY_SCHEMA;\n if (native) {\n initial = native;\n } else if (source !== null && source !== undefined) {\n try {\n initial = importForm(source, [createLegacyImporter()]).schema;\n } catch {\n initial = EMPTY_SCHEMA;\n }\n }\n this.draft.set(initial);\n this.past.set([]);\n this.future.set([]);\n this.selected.set(null);\n });\n }\n\n // -- document mutation ----------------------------------------------------\n\n private commit(next: FormSchema): void {\n this.past.update((stack) => [...stack.slice(-(HISTORY_LIMIT - 1)), this.draft()]);\n this.future.set([]);\n this.draft.set(next);\n this.schemaChanged.emit(next);\n }\n\n undo(): void {\n const past = this.past();\n if (past.length === 0) return;\n this.future.update((stack) => [this.draft(), ...stack]);\n this.past.set(past.slice(0, -1));\n this.draft.set(past[past.length - 1]!);\n this.selected.set(null);\n this.schemaChanged.emit(this.draft());\n }\n\n redo(): void {\n const future = this.future();\n if (future.length === 0) return;\n this.past.update((stack) => [...stack, this.draft()]);\n this.future.set(future.slice(1));\n this.draft.set(future[0]!);\n this.selected.set(null);\n this.schemaChanged.emit(this.draft());\n }\n\n add(entry: CatalogEntry): void {\n const node = entry.create(this.draft());\n const target = this.insertionPath();\n this.commit(insertNode(this.draft(), target, node));\n this.select(target);\n }\n\n /** New nodes land inside a selected container, after a selected leaf, or at the end. */\n private insertionPath(): NodePath {\n const selected = this.selected();\n if (!selected) return [this.draft().fields.length];\n const node = getNodeAt(this.draft(), selected);\n if (node?.kind === 'container' && node.type !== 'columns') {\n return [...selected, node.children.length];\n }\n const { parent, index } = parentOf(selected);\n return [...parent, index + 1];\n }\n\n removeSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(removeNode(this.draft(), selected));\n this.selected.set(null);\n }\n\n duplicateSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(duplicateNode(this.draft(), selected));\n }\n\n moveSelected(delta: -1 | 1): void {\n const selected = this.selected();\n if (!selected) return;\n const { parent, index } = parentOf(selected);\n const siblings =\n parent.length === 0\n ? this.draft().fields\n : (getNodeAt(this.draft(), parent) as { children?: FieldNode[] })?.children ?? [];\n const target = index + delta;\n if (target < 0 || target >= siblings.length) return;\n this.commit(moveNode(this.draft(), selected, [...parent, target]));\n this.select([...parent, target]);\n }\n\n applyPatch(event: InspectorPatch): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(updateNode(this.draft(), selected, event.patch));\n }\n\n /** Whether the selection can be nested into the container above it. */\n canNest(): boolean {\n const selected = this.selected();\n if (!selected) return false;\n const { parent, index } = parentOf(selected);\n if (index === 0) return false;\n return getNodeAt(this.draft(), [...parent, index - 1])?.kind === 'container';\n }\n\n canUnnest(): boolean {\n return (this.selected()?.length ?? 0) > 1;\n }\n\n /**\n * Nests the selection into the container right above it (Alt+→) — the\n * keyboard equivalent of dragging a field into a panel.\n */\n nestSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n const { parent, index } = parentOf(selected);\n if (index === 0) return;\n const previous = getNodeAt(this.draft(), [...parent, index - 1]);\n if (!previous || previous.kind !== 'container') return;\n // after the removal the container keeps its position (it sits before)\n const target = [...parent, index - 1, previous.children.length];\n this.commit(moveNode(this.draft(), selected, target));\n this.select(target);\n }\n\n /** Moves the selection out of its container, right after it (Alt+←). */\n unnestSelected(): void {\n const selected = this.selected();\n if (!selected || selected.length < 2) return;\n const { parent } = parentOf(selected);\n const { parent: grandparent, index: parentIndex } = parentOf(parent);\n const target = [...grandparent, parentIndex + 1];\n this.commit(moveNode(this.draft(), selected, target));\n this.select(target);\n }\n\n // -- reusable blocks ------------------------------------------------------\n\n /** Saves the selected node (with its subtree) as a reusable block. */\n saveAsBlock(): void {\n const selected = this.selected();\n const node = selected ? getNodeAt(this.draft(), selected) : null;\n if (!node) return;\n const label = node.label ?? node.key;\n const block: FormBlock = {\n id: `${node.key}-${this.effectiveBlocks().length + 1}`,\n label,\n node: JSON.parse(JSON.stringify(node)) as FieldNode,\n };\n const next = [...this.effectiveBlocks(), block];\n if (this.blocks() === null) {\n this.localBlocks.set(next);\n saveBlocks(this.storage, next);\n }\n this.blocksChanged.emit(next);\n }\n\n removeBlock(id: string): void {\n const next = this.effectiveBlocks().filter((block) => block.id !== id);\n if (this.blocks() === null) {\n this.localBlocks.set(next);\n saveBlocks(this.storage, next);\n }\n this.blocksChanged.emit(next);\n }\n\n isBlockEntry(entry: CatalogEntry): boolean {\n return entry.type.startsWith('block:');\n }\n\n blockIdOf(entry: CatalogEntry): string {\n return entry.type.slice('block:'.length);\n }\n\n // -- drag and drop --------------------------------------------------------\n\n /** What is being dragged: a palette entry or an existing node. */\n private readonly dragging = signal<\n { kind: 'entry'; entry: CatalogEntry } | { kind: 'node'; path: NodePath } | null\n >(null);\n /** Drop zone highlighted while hovering (see `dropId`). */\n readonly dropTarget = signal<string | null>(null);\n\n startEntryDrag(entry: CatalogEntry, event: DragEvent): void {\n this.dragging.set({ kind: 'entry', entry });\n event.dataTransfer?.setData('text/plain', entry.type);\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'copy';\n }\n\n startNodeDrag(path: NodePath, event?: DragEvent): void {\n this.dragging.set({ kind: 'node', path });\n event?.dataTransfer?.setData('text/plain', path.join('.'));\n if (event?.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n\n endDrag(): void {\n this.dragging.set(null);\n this.dropTarget.set(null);\n }\n\n allowDrop(target: DropTarget, event?: DragEvent): void {\n if (!this.dragging()) return;\n event?.preventDefault();\n event?.stopPropagation();\n this.dropTarget.set(dropId(target));\n }\n\n /** Drops onto `target` — the position (and column) the node should occupy. */\n drop(target: DropTarget, event?: DragEvent): void {\n event?.preventDefault();\n event?.stopPropagation();\n const dragging = this.dragging();\n this.endDrag();\n if (!dragging) return;\n const options = target.column === undefined ? undefined : { column: target.column };\n\n if (dragging.kind === 'entry') {\n const node = dragging.entry.create(this.draft());\n this.commit(insertNode(this.draft(), target.path, node, options));\n this.select(target.path);\n return;\n }\n const from = dragging.path;\n if (isSameOrInside(from, target.path)) return; // never drop a node into itself\n const adjusted = adjustAfterRemoval(from, target.path);\n this.commit(moveNode(this.draft(), from, adjusted, options));\n this.select(adjusted);\n }\n\n isDropTarget(target: DropTarget): boolean {\n return this.dropTarget() === dropId(target);\n }\n\n isDragging(): boolean {\n return this.dragging() !== null;\n }\n\n // -- selection ------------------------------------------------------------\n\n select(path: NodePath | null): void {\n this.selected.set(path);\n }\n\n isSelectedPath(path: NodePath): boolean {\n return this.selected()?.join('.') === path.join('.');\n }\n\n // -- import / export ------------------------------------------------------\n\n openExport(): void {\n this.dialog.set(this.dialog() === 'export' ? null : 'export');\n }\n\n doImport(raw: string): void {\n try {\n const parsed: unknown = JSON.parse(raw);\n const { schema } = importForm(parsed, [createLegacyImporter()]);\n this.commit(schema);\n this.selected.set(null);\n this.dialog.set(null);\n this.importError.set('');\n } catch (error) {\n this.importError.set(this.labels().importError + String(error));\n }\n }\n\n // -- keyboard -------------------------------------------------------------\n\n onKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) return;\n const key = event.key.toLowerCase();\n if (event.ctrlKey && key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.undo();\n } else if ((event.ctrlKey && key === 'y') || (event.ctrlKey && event.shiftKey && key === 'z')) {\n event.preventDefault();\n this.redo();\n } else if (event.ctrlKey && key === 'd') {\n event.preventDefault();\n this.duplicateSelected();\n } else if (key === 'delete') {\n event.preventDefault();\n this.removeSelected();\n } else if (key === 'escape') {\n event.preventDefault();\n this.workspaceMenu.set(false);\n this.dialog.set(null);\n this.select(null);\n } else if (event.altKey && key === 'arrowup') {\n event.preventDefault();\n this.moveSelected(-1);\n } else if (event.altKey && key === 'arrowdown') {\n event.preventDefault();\n this.moveSelected(1);\n } else if (event.altKey && key === 'arrowright') {\n event.preventDefault();\n this.nestSelected();\n } else if (event.altKey && key === 'arrowleft') {\n event.preventDefault();\n this.unnestSelected();\n }\n }\n}\n","/*\n * Designer entry point (`@mosaicoo/form-angular/designer`).\n *\n * Authoring lives behind this secondary entry so applications that only\n * RENDER forms never load designer code — required for federated hosts and\n * lazy loading.\n */\nexport { FormDesignerComponent } from './designer.component.js';\nexport { DesignerNodeComponent } from './designer-node.component.js';\nexport { InspectorComponent, type InspectorPatch } from './inspector.component.js';\nexport { DEFAULT_CATALOG, type CatalogEntry, type CatalogGroup } from './field-catalog.js';\nexport type { FormBlock } from './blocks.js';\nexport { DESIGNER_LABELS_EN, type DesignerLabels } from './designer-labels.js';\nexport { dropId, type DropTarget } from './drag-drop.js';\nexport {\n DEFAULT_LAYOUT,\n PANEL_LABELS,\n WORKSPACE_PRESETS,\n type DockSide,\n type PanelId,\n type WorkspaceLayout,\n type WorkspacePreset,\n} from './workspace.js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["input","STORAGE_KEY"],"mappings":"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"}
1
+ {"version":3,"file":"mosaicoo-form-angular-designer.mjs","sources":["../../../packages/angular/designer/src/drag-drop.ts","../../../packages/angular/designer/src/designer-node.component.ts","../../../packages/angular/designer/src/inspector.component.ts","../../../packages/angular/designer/src/field-catalog.ts","../../../packages/angular/designer/src/blocks.ts","../../../packages/angular/designer/src/designer-labels.ts","../../../packages/angular/designer/src/workspace.ts","../../../packages/angular/designer/src/designer.component.ts","../../../packages/angular/designer/src/public-api.ts","../../../packages/angular/designer/src/mosaicoo-form-angular-designer.ts"],"sourcesContent":["import type { NodePath } from '@mosaicoo/form-core';\n\n/**\n * Drop-target identity shared by the canvas and the node components.\n * A target is a position in a parent's children list, optionally bound to a\n * column of a `columns` container.\n */\nexport interface DropTarget {\n path: NodePath;\n /** Column index when the parent lays children out in columns. */\n column?: number;\n}\n\nexport function dropId(target: DropTarget): string {\n return target.column === undefined\n ? target.path.join('.')\n : `${target.path.join('.')}@${target.column}`;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type { ContainerField, FieldNode, FormEngine, NodePath } from '@mosaicoo/form-core';\nimport { FormNodeComponent } from '@mosaicoo/form-angular';\nimport { dropId, type DropTarget } from './drag-drop.js';\n\n/**\n * Canvas node: draws the selection frame and structure chrome, delegating\n * leaf rendering to the RUNTIME `<mform-node>` so what you see is what the\n * renderer will produce. Canvas controls are non-interactive — testing\n * happens in Preview mode.\n *\n * Drop zones sit between children (and inside each column), so fields can be\n * dragged INTO containers, not just reordered at the root.\n */\n@Component({\n selector: 'mform-designer-node',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [FormNodeComponent],\n template: `\n @let n = node();\n <div\n class=\"dz-node\"\n [class.is-selected]=\"isSelected()\"\n [class.is-container]=\"n.kind === 'container'\"\n (click)=\"onSelect($event)\"\n role=\"button\"\n tabindex=\"0\"\n (keydown.enter)=\"onSelect($event)\"\n [attr.aria-label]=\"chip() + (isSelected() ? ' (selected)' : '')\"\n >\n <span class=\"dz-chip\">{{ chip() }}</span>\n\n @if (n.kind === 'container') {\n @if (n.type === 'tabs') {\n <div class=\"dz-tabbar\">\n @for (tab of container().children; track tab.key; let i = $index) {\n <button\n type=\"button\"\n class=\"dz-tab\"\n [class.is-active]=\"activeTab() === i\"\n (click)=\"setTab(i, $event)\"\n >\n {{ tab.label || 'Tab ' + (i + 1) }}\n </button>\n }\n </div>\n @for (tab of container().children; track tab.key; let i = $index) {\n @if (activeTab() === i) {\n <div class=\"dz-children\">\n <mform-designer-node\n [node]=\"tab\"\n [path]=\"childPath(i)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n </div>\n }\n }\n } @else if (n.type === 'columns' && container().columns?.length) {\n <div class=\"dz-columns\" [style.grid-template-columns]=\"columnsTemplate()\">\n @for (column of container().columns; track $index; let c = $index) {\n <div class=\"dz-column\">\n @for (childIndex of column.children; track childIndex) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isOver(childPath(childIndex), c)\"\n (dragover)=\"onDragOver(childPath(childIndex), c, $event)\"\n (drop)=\"onDrop(childPath(childIndex), c, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"container().children[childIndex]!\"\n [path]=\"childPath(childIndex)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n draggable=\"true\"\n (dragstart)=\"onDragStart(childPath(childIndex), $event)\"\n (dragend)=\"dragFinished.emit()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isOver(childPath(container().children.length), c)\"\n (dragover)=\"onDragOver(childPath(container().children.length), c, $event)\"\n (drop)=\"onDrop(childPath(container().children.length), c, $event)\"\n ></div>\n @if (column.children.length === 0) {\n <div class=\"dz-empty\">empty column</div>\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"dz-children\">\n @for (child of container().children; track child.key; let i = $index) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isOver(childPath(i))\"\n (dragover)=\"onDragOver(childPath(i), undefined, $event)\"\n (drop)=\"onDrop(childPath(i), undefined, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"child\"\n [path]=\"childPath(i)\"\n [engine]=\"engine()\"\n [selected]=\"selected()\"\n [dragging]=\"dragging()\"\n [activeDrop]=\"activeDrop()\"\n draggable=\"true\"\n (dragstart)=\"onDragStart(childPath(i), $event)\"\n (dragend)=\"dragFinished.emit()\"\n (selectNode)=\"selectNode.emit($event)\"\n (nodeDragStart)=\"nodeDragStart.emit($event)\"\n (dragOverTarget)=\"dragOverTarget.emit($event)\"\n (dropOnTarget)=\"dropOnTarget.emit($event)\"\n (dragFinished)=\"dragFinished.emit()\"\n />\n } @empty {\n <div class=\"dz-empty\">empty — drop fields here</div>\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isOver(childPath(container().children.length))\"\n (dragover)=\"onDragOver(childPath(container().children.length), undefined, $event)\"\n (drop)=\"onDrop(childPath(container().children.length), undefined, $event)\"\n ></div>\n </div>\n }\n } @else {\n <div class=\"dz-leaf\" inert>\n <mform-node [node]=\"n\" [engine]=\"engine()\" [tick]=\"0\" />\n </div>\n }\n </div>\n `,\n})\nexport class DesignerNodeComponent {\n readonly node = input.required<FieldNode>();\n readonly path = input.required<NodePath>();\n readonly engine = input.required<FormEngine>();\n readonly selected = input<NodePath | null>(null);\n /** True while something is being dragged (reveals the drop zones). */\n readonly dragging = input<boolean>(false);\n /** Id of the drop zone currently hovered. */\n readonly activeDrop = input<string | null>(null);\n\n readonly selectNode = output<NodePath>();\n readonly nodeDragStart = output<NodePath>();\n readonly dragOverTarget = output<DropTarget>();\n readonly dropOnTarget = output<DropTarget>();\n readonly dragFinished = output<void>();\n\n readonly activeTab = signal(0);\n\n container(): ContainerField {\n return this.node() as ContainerField;\n }\n\n chip(): string {\n const node = this.node();\n const label = node.label ?? node.key;\n return `${label} · ${node.type}`;\n }\n\n isSelected(): boolean {\n const selected = this.selected();\n return selected !== null && selected.join('.') === this.path().join('.');\n }\n\n childPath(index: number): NodePath {\n return [...this.path(), index];\n }\n\n columnsTemplate(): string {\n const columns = this.container().columns ?? [];\n const total = columns.reduce((sum, c) => sum + c.width, 0) || 12;\n return columns.map((c) => `${((c.width / total) * 100).toFixed(3)}fr`).join(' ');\n }\n\n onSelect(event: Event): void {\n event.stopPropagation();\n this.selectNode.emit(this.path());\n }\n\n setTab(index: number, event: Event): void {\n event.stopPropagation();\n this.activeTab.set(index);\n }\n\n // -- drag and drop --------------------------------------------------------\n\n isOver(path: NodePath, column?: number): boolean {\n return this.activeDrop() === dropId({ path, column });\n }\n\n onDragStart(path: NodePath, event: Event): void {\n event.stopPropagation();\n this.nodeDragStart.emit(path);\n }\n\n onDragOver(path: NodePath, column: number | undefined, event: DragEvent): void {\n if (!this.dragging()) return;\n event.preventDefault();\n event.stopPropagation();\n this.dragOverTarget.emit({ path, column });\n }\n\n onDrop(path: NodePath, column: number | undefined, event: DragEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dropOnTarget.emit({ path, column });\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n input,\n output,\n signal,\n} from '@angular/core';\nimport type {\n Condition,\n ContainerField,\n FieldNode,\n FieldOption,\n FormSchema,\n InputField,\n StaticField,\n ValidatorSpec,\n} from '@mosaicoo/form-core';\nimport { collectInputs } from '@mosaicoo/form-core';\n\n/** Patch emitted towards the shell (applied via core `updateNode`). */\nexport interface InspectorPatch {\n patch: Partial<FieldNode>;\n}\n\n/**\n * Property panel of the selected node. Emits immutable patches — the shell\n * owns the document, history and validation.\n */\n@Component({\n selector: 'mform-inspector',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n template: `\n @let n = node();\n <div class=\"dz-inspector\">\n <h3>{{ n.type }} <code>{{ n.key }}</code></h3>\n\n <label class=\"dz-prop\">\n <span>Key</span>\n <input type=\"text\" [value]=\"n.key\" (change)=\"patchText('key', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Label</span>\n <input type=\"text\" [value]=\"n.label ?? ''\" (change)=\"patchText('label', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Description</span>\n <input type=\"text\" [value]=\"n.description ?? ''\" (change)=\"patchText('description', $event)\" />\n </label>\n\n @if (n.kind === 'input') {\n <label class=\"dz-prop\">\n <span>Placeholder</span>\n <input type=\"text\" [value]=\"field().placeholder ?? ''\" (change)=\"patchText('placeholder', $event)\" />\n </label>\n <label class=\"dz-prop\">\n <span>Default value</span>\n <input type=\"text\" [value]=\"defaultValueText()\" (change)=\"patchDefault($event)\" />\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"isRequired()\" (change)=\"toggleRequired($event)\" />\n <span>Required</span>\n </label>\n\n <details class=\"dz-section\" open>\n <summary>Validation</summary>\n <label class=\"dz-prop\"><span>Min length</span>\n <input type=\"number\" [value]=\"validatorValue('minLength')\" (change)=\"patchValidator('minLength', $event)\" /></label>\n <label class=\"dz-prop\"><span>Max length</span>\n <input type=\"number\" [value]=\"validatorValue('maxLength')\" (change)=\"patchValidator('maxLength', $event)\" /></label>\n <label class=\"dz-prop\"><span>Min</span>\n <input type=\"number\" [value]=\"validatorValue('min')\" (change)=\"patchValidator('min', $event)\" /></label>\n <label class=\"dz-prop\"><span>Max</span>\n <input type=\"number\" [value]=\"validatorValue('max')\" (change)=\"patchValidator('max', $event)\" /></label>\n <label class=\"dz-prop\"><span>Pattern (regex)</span>\n <input type=\"text\" [value]=\"patternValue()\" (change)=\"patchPattern($event)\" /></label>\n </details>\n\n @if (hasOptions()) {\n <details class=\"dz-section\" open>\n <summary>Options</summary>\n @for (option of field().options ?? []; track $index; let i = $index) {\n <div class=\"dz-option-row\">\n <input type=\"text\" placeholder=\"Label\" [value]=\"option.label\"\n (change)=\"patchOption(i, 'label', $event)\" />\n <input type=\"text\" placeholder=\"Value\" [value]=\"option.value\"\n (change)=\"patchOption(i, 'value', $event)\" />\n <button type=\"button\" (click)=\"removeOption(i)\" aria-label=\"Remove option\">✕</button>\n </div>\n }\n <button type=\"button\" class=\"dz-add\" (click)=\"addOption()\">+ Option</button>\n </details>\n }\n }\n\n @if (n.kind === 'static' && n.type === 'content') {\n <label class=\"dz-prop\">\n <span>Content (HTML)</span>\n <textarea rows=\"5\" [value]=\"static_().content ?? ''\" (change)=\"patchText('content', $event)\"></textarea>\n </label>\n }\n\n @if (n.kind === 'container' && n.type === 'columns') {\n <label class=\"dz-prop\">\n <span>Column widths (of 12, comma-separated)</span>\n <input type=\"text\" [value]=\"columnWidths()\" (change)=\"patchColumnWidths($event)\" />\n </label>\n }\n\n <details class=\"dz-section\">\n <summary>Visibility</summary>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"n.hidden === true\" (change)=\"patchFlag('hidden', $event)\" />\n <span>Hidden</span>\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"n.disabled === true\" (change)=\"patchFlag('disabled', $event)\" />\n <span>Disabled</span>\n </label>\n <label class=\"dz-prop\">\n <span>Show when field…</span>\n <select [value]=\"simpleCondition()?.field ?? ''\" (change)=\"patchConditionField($event)\">\n <option value=\"\">(always visible)</option>\n @for (path of otherInputPaths(); track path) {\n <option [value]=\"path\" [selected]=\"simpleCondition()?.field === path\">{{ path }}</option>\n }\n </select>\n </label>\n @if (simpleCondition()) {\n <label class=\"dz-prop\">\n <span>…equals value</span>\n <input type=\"text\" [value]=\"conditionValueText()\" (change)=\"patchConditionValue($event)\" />\n </label>\n }\n <label class=\"dz-prop\">\n <span>Show when expression (advanced)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: total > 1000 && status == 'ok'\"\n [value]=\"conditionExpression()\"\n (change)=\"patchConditionExpression($event)\"\n />\n </label>\n </details>\n\n @if (n.kind === 'input') {\n <details class=\"dz-section\">\n <summary>Advanced</summary>\n <label class=\"dz-prop\">\n <span>Calculated value (expression)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: qty * price\"\n [value]=\"field().calculate ?? ''\"\n (change)=\"patchCalculate($event)\"\n />\n </label>\n <label class=\"dz-prop\">\n <span>Input mask (0=digit A=letter S=any)</span>\n <input\n type=\"text\"\n placeholder=\"ex.: 000.000.000-00\"\n [value]=\"field().format?.mask ?? ''\"\n (change)=\"patchMask($event)\"\n />\n </label>\n <label class=\"dz-check\">\n <input type=\"checkbox\" [checked]=\"field().multiple === true\" (change)=\"patchMultiple($event)\" />\n <span>Multiple values</span>\n </label>\n </details>\n\n <details class=\"dz-section\">\n <summary>Options source</summary>\n <label class=\"dz-prop\">\n <span>Source</span>\n <select [value]=\"sourceKind()\" (change)=\"patchSourceKind($event)\">\n <option value=\"\">Static list</option>\n <option value=\"provider\" [selected]=\"sourceKind() === 'provider'\">Host provider</option>\n <option value=\"remote\" [selected]=\"sourceKind() === 'remote'\">Remote URL</option>\n </select>\n </label>\n @if (sourceKind() === 'provider') {\n <label class=\"dz-prop\">\n <span>Provider name</span>\n <input type=\"text\" [value]=\"providerName()\" (change)=\"patchProviderName($event)\" />\n </label>\n }\n @if (sourceKind() === 'remote') {\n <label class=\"dz-prop\">\n <span>URL</span>\n <input type=\"text\" [value]=\"remoteUrl()\" (change)=\"patchRemoteUrl($event)\" />\n </label>\n }\n @if (sourceKind()) {\n <label class=\"dz-prop\">\n <span>Refresh on (field path or \"data\")</span>\n <input type=\"text\" [value]=\"refreshOn()\" (change)=\"patchRefreshOn($event)\" />\n </label>\n }\n </details>\n }\n\n <!-- Type-specific configuration for CUSTOM components: the host reads\n these from field.props (e.g. a board's columns, a chart's series). -->\n <details class=\"dz-section\" [open]=\"hasProps()\">\n <summary>Type settings (props)</summary>\n <label class=\"dz-prop\">\n <span>JSON passed to the field component</span>\n <textarea\n rows=\"5\"\n spellcheck=\"false\"\n [value]=\"propsText()\"\n (change)=\"patchProps($event)\"\n ></textarea>\n </label>\n @if (propsError()) {\n <p class=\"dz-import-error\" role=\"alert\">{{ propsError() }}</p>\n }\n </details>\n </div>\n `,\n})\nexport class InspectorComponent {\n readonly node = input.required<FieldNode>();\n readonly schema = input.required<FormSchema>();\n readonly nodePatch = output<InspectorPatch>();\n\n field(): InputField {\n return this.node() as InputField;\n }\n\n static_(): StaticField {\n return this.node() as StaticField;\n }\n\n hasOptions(): boolean {\n return ['select', 'radio', 'checkbox-group'].includes(this.node().type);\n }\n\n readonly otherInputPaths = computed(() =>\n collectInputs(this.schema())\n .map((entry) => entry.path)\n .filter((path) => !path.includes('*')),\n );\n\n private emitPatch(patch: Partial<FieldNode>): void {\n this.nodePatch.emit({ patch });\n }\n\n private inputValue(event: Event): string {\n return (event.target as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement).value;\n }\n\n patchText(member: 'key' | 'label' | 'description' | 'placeholder' | 'content', event: Event): void {\n const value = this.inputValue(event).trim();\n if (member === 'key' && value === '') return; // key can never be emptied\n this.emitPatch({ [member]: value === '' ? undefined : value } as Partial<FieldNode>);\n }\n\n patchFlag(member: 'hidden' | 'disabled', event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.emitPatch({ [member]: checked ? true : undefined } as Partial<FieldNode>);\n }\n\n defaultValueText(): string {\n const value = this.field().defaultValue;\n return value === undefined || value === null ? '' : String(value);\n }\n\n patchDefault(event: Event): void {\n const raw = this.inputValue(event);\n if (raw === '') {\n this.emitPatch({ defaultValue: undefined } as Partial<FieldNode>);\n return;\n }\n const field = this.field();\n let value: unknown = raw;\n if (field.dataType === 'number') value = Number(raw);\n if (field.dataType === 'boolean') value = raw === 'true';\n this.emitPatch({ defaultValue: value } as Partial<FieldNode>);\n }\n\n // -- validators -----------------------------------------------------------\n\n private validators(): ValidatorSpec[] {\n return this.field().validators ?? [];\n }\n\n isRequired(): boolean {\n return this.validators().some((v) => v.type === 'required');\n }\n\n toggleRequired(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n const rest = this.validators().filter((v) => v.type !== 'required');\n this.emitValidators(checked ? [{ type: 'required' }, ...rest] : rest);\n }\n\n validatorValue(type: 'minLength' | 'maxLength' | 'min' | 'max'): string {\n const spec = this.validators().find((v) => v.type === type);\n return spec && 'value' in spec ? String(spec.value) : '';\n }\n\n patchValidator(type: 'minLength' | 'maxLength' | 'min' | 'max', event: Event): void {\n const raw = this.inputValue(event);\n const rest = this.validators().filter((v) => v.type !== type);\n this.emitValidators(raw === '' ? rest : [...rest, { type, value: Number(raw) }]);\n }\n\n patternValue(): string {\n const spec = this.validators().find((v) => v.type === 'pattern');\n return spec && 'value' in spec ? String(spec.value) : '';\n }\n\n patchPattern(event: Event): void {\n const raw = this.inputValue(event);\n const rest = this.validators().filter((v) => v.type !== 'pattern');\n this.emitValidators(raw === '' ? rest : [...rest, { type: 'pattern', value: raw }]);\n }\n\n private emitValidators(validators: ValidatorSpec[]): void {\n this.emitPatch({ validators: validators.length ? validators : undefined } as Partial<FieldNode>);\n }\n\n // -- options --------------------------------------------------------------\n\n patchOption(index: number, member: 'label' | 'value', event: Event): void {\n const options = [...(this.field().options ?? [])];\n options[index] = { ...options[index]!, [member]: this.inputValue(event) };\n this.emitPatch({ options } as Partial<FieldNode>);\n }\n\n addOption(): void {\n const options = [...(this.field().options ?? [])];\n options.push({ label: `Option ${options.length + 1}`, value: `option${options.length + 1}` });\n this.emitPatch({ options } as Partial<FieldNode>);\n }\n\n removeOption(index: number): void {\n const options = (this.field().options ?? []).filter((_, i) => i !== index);\n this.emitPatch({ options: options.length ? options : undefined } as Partial<FieldNode>);\n }\n\n // -- columns --------------------------------------------------------------\n\n columnWidths(): string {\n return ((this.node() as ContainerField).columns ?? []).map((c) => c.width).join(', ');\n }\n\n patchColumnWidths(event: Event): void {\n const container = this.node() as ContainerField;\n const widths = this.inputValue(event)\n .split(',')\n .map((part) => Number(part.trim()))\n .filter((width) => Number.isFinite(width) && width > 0);\n if (widths.length === 0) return;\n const existing = container.columns ?? [];\n const columns = widths.map((width, i) => ({\n width,\n children: existing[i]?.children ?? [],\n }));\n // children in dropped columns are re-attached to the last remaining one\n for (let i = widths.length; i < existing.length; i++) {\n columns[columns.length - 1]!.children.push(...existing[i]!.children);\n }\n this.emitPatch({ columns } as Partial<FieldNode>);\n }\n\n // -- conditional ----------------------------------------------------------\n\n simpleCondition(): Extract<Condition, { field: string }> | null {\n const condition = this.node().conditional;\n return condition && 'field' in condition ? condition : null;\n }\n\n conditionExpression(): string {\n const condition = this.node().conditional;\n return condition && 'expression' in condition ? condition.expression : '';\n }\n\n conditionValueText(): string {\n const value = this.simpleCondition()?.value;\n return value === undefined || value === null ? '' : String(value);\n }\n\n patchConditionField(event: Event): void {\n const field = this.inputValue(event);\n if (field === '') {\n this.emitPatch({ conditional: undefined });\n return;\n }\n const current = this.simpleCondition();\n const conditional: Condition = {\n show: current?.show ?? true,\n op: current?.op ?? 'eq',\n field,\n value: current?.value ?? '',\n };\n this.emitPatch({ conditional });\n }\n\n patchConditionValue(event: Event): void {\n const current = this.simpleCondition();\n if (!current) return;\n const raw = this.inputValue(event);\n const value: unknown = raw === 'true' ? true : raw === 'false' ? false : raw;\n this.emitPatch({ conditional: { ...current, value } });\n }\n\n patchConditionExpression(event: Event): void {\n const expression = this.inputValue(event).trim();\n if (expression === '') {\n // clearing the expression keeps a simple condition, if one existed\n this.emitPatch({ conditional: this.simpleCondition() ?? undefined });\n return;\n }\n this.emitPatch({ conditional: { show: true, expression } });\n }\n\n // -- advanced (calculate / mask) ------------------------------------------\n\n patchCalculate(event: Event): void {\n const expression = this.inputValue(event).trim();\n this.emitPatch({ calculate: expression === '' ? undefined : expression } as Partial<FieldNode>);\n }\n\n patchMask(event: Event): void {\n const mask = this.inputValue(event).trim();\n this.emitPatch({ format: mask === '' ? undefined : { mask } } as Partial<FieldNode>);\n }\n\n patchMultiple(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n this.emitPatch({\n multiple: checked ? true : undefined,\n dataType: checked ? 'array' : 'string',\n } as Partial<FieldNode>);\n }\n\n // -- options source -------------------------------------------------------\n\n sourceKind(): '' | 'provider' | 'remote' {\n return this.field().optionsSource?.type ?? '';\n }\n\n providerName(): string {\n const source = this.field().optionsSource;\n return source?.type === 'provider' ? source.name : '';\n }\n\n remoteUrl(): string {\n const source = this.field().optionsSource;\n return source?.type === 'remote' ? source.url : '';\n }\n\n refreshOn(): string {\n return this.field().optionsSource?.refreshOn ?? '';\n }\n\n patchSourceKind(event: Event): void {\n const kind = this.inputValue(event);\n if (kind === 'provider') {\n this.emitPatch({\n optionsSource: { type: 'provider', name: this.providerName() || this.field().key },\n } as Partial<FieldNode>);\n } else if (kind === 'remote') {\n this.emitPatch({\n optionsSource: { type: 'remote', url: this.remoteUrl() },\n } as Partial<FieldNode>);\n } else {\n this.emitPatch({ optionsSource: undefined } as Partial<FieldNode>);\n }\n }\n\n patchProviderName(event: Event): void {\n const name = this.inputValue(event).trim();\n if (name === '') return;\n this.emitPatch({\n optionsSource: { ...this.field().optionsSource, type: 'provider', name },\n } as Partial<FieldNode>);\n }\n\n patchRemoteUrl(event: Event): void {\n const url = this.inputValue(event).trim();\n this.emitPatch({\n optionsSource: { ...this.field().optionsSource, type: 'remote', url },\n } as Partial<FieldNode>);\n }\n\n patchRefreshOn(event: Event): void {\n const source = this.field().optionsSource;\n if (!source) return;\n const refreshOn = this.inputValue(event).trim();\n const next = { ...source };\n if (refreshOn === '') delete next.refreshOn;\n else next.refreshOn = refreshOn;\n this.emitPatch({ optionsSource: next } as Partial<FieldNode>);\n }\n\n // -- props (type-specific settings for custom components) -----------------\n\n readonly propsError = signal('');\n\n hasProps(): boolean {\n return Object.keys(this.node().props ?? {}).length > 0;\n }\n\n propsText(): string {\n const props = this.node().props;\n return props && Object.keys(props).length > 0 ? JSON.stringify(props, null, 2) : '';\n }\n\n patchProps(event: Event): void {\n const raw = this.inputValue(event).trim();\n if (raw === '') {\n this.propsError.set('');\n this.emitPatch({ props: undefined });\n return;\n }\n try {\n const parsed: unknown = JSON.parse(raw);\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n this.propsError.set('Props must be a JSON object.');\n return;\n }\n this.propsError.set('');\n this.emitPatch({ props: parsed as Record<string, unknown> });\n } catch (error) {\n this.propsError.set('Invalid JSON: ' + String(error instanceof Error ? error.message : error));\n }\n }\n}\n\n/** Re-export so the shell can type option edits without a deep import. */\nexport type { FieldOption };\n","import type { FieldNode, FormSchema } from '@mosaicoo/form-core';\nimport { generateKey } from '@mosaicoo/form-core';\n\n/**\n * Palette catalog: the node factories the Designer offers. Hosts can extend\n * the palette via the `extraCatalog` input of `<mform-designer>` — entries\n * here stay generic (no domain assumptions).\n */\n\nexport interface CatalogEntry {\n /** Field `type` produced (also used to key custom renderers). */\n type: string;\n label: string;\n /** Short glyph shown in the palette. */\n icon: string;\n create(schema: FormSchema): FieldNode;\n}\n\nexport interface CatalogGroup {\n label: string;\n entries: CatalogEntry[];\n}\n\nfunction input(\n type: string,\n dataType: 'string' | 'number' | 'boolean' | 'date' | 'object' | 'array',\n label: string,\n extra?: Partial<Extract<FieldNode, { kind: 'input' }>>,\n): (schema: FormSchema) => FieldNode {\n return (schema) => ({\n kind: 'input',\n key: generateKey(schema, type),\n type,\n label,\n dataType,\n ...extra,\n });\n}\n\nexport const DEFAULT_CATALOG: CatalogGroup[] = [\n {\n label: 'Basic',\n entries: [\n { type: 'text', label: 'Text', icon: 'Aa', create: input('text', 'string', 'Text') },\n { type: 'textarea', label: 'Text area', icon: '¶', create: input('textarea', 'string', 'Text area') },\n { type: 'number', label: 'Number', icon: '#', create: input('number', 'number', 'Number') },\n { type: 'currency', label: 'Currency', icon: '$', create: input('currency', 'number', 'Currency') },\n { type: 'checkbox', label: 'Checkbox', icon: '☑', create: input('checkbox', 'boolean', 'Checkbox') },\n { type: 'email', label: 'Email', icon: '@', create: input('email', 'string', 'Email', { validators: [{ type: 'email' }] }) },\n { type: 'phone', label: 'Phone', icon: '☎', create: input('phone', 'string', 'Phone') },\n { type: 'password', label: 'Password', icon: '••', create: input('password', 'string', 'Password') },\n ],\n },\n {\n label: 'Choices',\n entries: [\n {\n type: 'select', label: 'Select', icon: '▾',\n create: (s) => ({ ...input('select', 'string', 'Select')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n {\n type: 'radio', label: 'Radio', icon: '◉',\n create: (s) => ({ ...input('radio', 'string', 'Radio')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n {\n type: 'checkbox-group', label: 'Checkbox group', icon: '☷',\n create: (s) => ({ ...input('checkbox-group', 'object', 'Checkbox group')(s), options: [\n { label: 'Option 1', value: 'option1' }, { label: 'Option 2', value: 'option2' },\n ] } as FieldNode),\n },\n { type: 'tags', label: 'Tags', icon: '⌗', create: input('tags', 'array', 'Tags') },\n {\n type: 'reference', label: 'Reference', icon: '⌕',\n create: (s) => ({\n ...input('reference', 'string', 'Reference')(s),\n optionsSource: { type: 'provider', name: 'reference' },\n } as FieldNode),\n },\n ],\n },\n {\n label: 'Date & files',\n entries: [\n { type: 'datetime', label: 'Date & time', icon: '📅', create: input('datetime', 'date', 'Date & time') },\n { type: 'day', label: 'Date', icon: '▦', create: input('day', 'string', 'Date') },\n { type: 'time', label: 'Time', icon: '◷', create: input('time', 'string', 'Time') },\n { type: 'file', label: 'File', icon: '📎', create: input('file', 'array', 'File') },\n ],\n },\n {\n label: 'Layout',\n entries: [\n {\n type: 'panel', label: 'Panel', icon: '▭',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'panel'), type: 'panel',\n dataScope: 'inherit', label: 'Panel', children: [] }),\n },\n {\n type: 'columns', label: 'Columns', icon: '▥',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'columns'), type: 'columns',\n dataScope: 'inherit', children: [], columns: [\n { width: 6, children: [] }, { width: 6, children: [] },\n ] }),\n },\n {\n type: 'tabs', label: 'Tabs', icon: '⧉',\n create: (s) => {\n const key = generateKey(s, 'tabs');\n return { kind: 'container', key, type: 'tabs', dataScope: 'inherit', children: [\n { kind: 'container', key: `${key}-tab-1`, type: 'panel', dataScope: 'inherit', label: 'Tab 1', children: [] },\n { kind: 'container', key: `${key}-tab-2`, type: 'panel', dataScope: 'inherit', label: 'Tab 2', children: [] },\n ] };\n },\n },\n {\n type: 'accordion', label: 'Accordion', icon: '☰',\n create: (s) => {\n const key = generateKey(s, 'accordion');\n return { kind: 'container', key, type: 'accordion', dataScope: 'inherit', children: [\n { kind: 'container', key: `${key}-section-1`, type: 'panel', dataScope: 'inherit', label: 'Section 1', children: [] },\n { kind: 'container', key: `${key}-section-2`, type: 'panel', dataScope: 'inherit', label: 'Section 2', children: [] },\n ] };\n },\n },\n {\n type: 'group', label: 'Data group', icon: '⧈',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'group'), type: 'group',\n dataScope: 'nested', label: 'Group', children: [] }),\n },\n {\n type: 'datagrid', label: 'Data grid', icon: '☰',\n create: (s) => ({ kind: 'container', key: generateKey(s, 'datagrid'), type: 'datagrid',\n dataScope: 'array', label: 'Data grid', children: [] }),\n },\n ],\n },\n {\n label: 'Static',\n entries: [\n {\n type: 'content', label: 'Content', icon: '¶¶',\n create: (s) => ({ kind: 'static', key: generateKey(s, 'content'), type: 'content',\n content: '<p>Content</p>' }),\n },\n {\n type: 'button', label: 'Submit button', icon: '⏎',\n create: (s) => ({ kind: 'static', key: generateKey(s, 'button'), type: 'button',\n label: 'Submit', props: { action: 'submit' } }),\n },\n ],\n },\n];\n","import type { FieldNode } from '@mosaicoo/form-core';\n\n/**\n * Reusable blocks: a named node subtree (an address group, a payment panel,\n * a compliance section) that can be dropped into any form. Blocks are plain\n * schema fragments — serializable, portable and free of runtime state.\n *\n * The designer keeps them locally by default; hosts that want blocks shared\n * across users bind `[blocks]` and persist `(blocksChanged)` themselves.\n */\n\nexport interface FormBlock {\n id: string;\n label: string;\n /** Schema subtree; keys are regenerated on insert to stay unique. */\n node: FieldNode;\n}\n\nconst STORAGE_KEY = 'mform-designer-blocks';\n\nexport function loadBlocks(storage: Storage | null): FormBlock[] {\n if (!storage) return [];\n try {\n const raw = storage.getItem(STORAGE_KEY);\n const parsed: unknown = raw ? JSON.parse(raw) : [];\n return Array.isArray(parsed) ? (parsed as FormBlock[]) : [];\n } catch {\n return [];\n }\n}\n\nexport function saveBlocks(storage: Storage | null, blocks: FormBlock[]): void {\n try {\n storage?.setItem(STORAGE_KEY, JSON.stringify(blocks));\n } catch {\n /* storage unavailable — blocks stay in memory for this session */\n }\n}\n","/**\n * Every visible string of the designer, so hosts can localize the authoring\n * experience the same way they already localize the runtime. Override\n * partially — unset entries fall back to English.\n *\n * The palette itself is DATA: translate `DEFAULT_CATALOG` (or supply your own\n * groups) and pass it through the `[catalog]` input.\n */\nexport interface DesignerLabels {\n undo: string;\n redo: string;\n moveUp: string;\n moveDown: string;\n nest: string;\n unnest: string;\n duplicate: string;\n delete: string;\n saveBlock: string;\n viewport: string;\n workspace: string;\n panels: string;\n presets: string;\n resetLayout: string;\n moveLeft: string;\n moveRight: string;\n hidePanel: string;\n import: string;\n export: string;\n preview: string;\n design: string;\n cancel: string;\n close: string;\n importTitle: string;\n importPlaceholder: string;\n importError: string;\n exportTitle: string;\n canvasEmpty: string;\n selectField: string;\n testData: string;\n panelFields: string;\n panelStructure: string;\n panelProperties: string;\n noFields: string;\n}\n\nexport const DESIGNER_LABELS_EN: DesignerLabels = {\n undo: 'Undo (Ctrl+Z)',\n redo: 'Redo (Ctrl+Y)',\n moveUp: 'Move up (Alt+↑)',\n moveDown: 'Move down (Alt+↓)',\n nest: 'Nest into the container above (Alt+→)',\n unnest: 'Move out of the container (Alt+←)',\n duplicate: 'Duplicate (Ctrl+D)',\n delete: 'Delete (Del)',\n saveBlock: 'Save as reusable block',\n viewport: 'Preview width',\n workspace: 'Workspace',\n panels: 'Panels',\n presets: 'Presets',\n resetLayout: 'Reset layout',\n moveLeft: 'Move left',\n moveRight: 'Move right',\n hidePanel: 'Hide panel',\n import: 'Import',\n export: 'Export',\n preview: 'Preview',\n design: 'Design',\n cancel: 'Cancel',\n close: 'Close',\n importTitle: 'Import definition (native schema or supported formats)',\n importPlaceholder: '{\"version\":1,\"fields\":[…]} or a legacy definition',\n importError: 'Could not import: ',\n exportTitle: 'Schema JSON',\n canvasEmpty: 'Click a field in the palette — or drag it here — to start building.',\n selectField: 'Select a field to edit its properties.',\n testData: 'Test data',\n panelFields: 'Fields',\n panelStructure: 'Structure',\n panelProperties: 'Properties',\n noFields: 'no fields yet',\n};\n","/**\n * Designer workspace layout.\n *\n * Panels are dockable like in professional tools: each one can sit on the\n * left, on the right, or be hidden — the canvas always keeps the center. The\n * arrangement is a plain serializable object so hosts can persist it per user\n * (the designer also remembers it locally by default).\n */\n\nexport type DockSide = 'left' | 'right' | 'hidden';\n\n/** Panels that can be docked around the canvas. */\nexport type PanelId = 'palette' | 'structure' | 'properties';\n\nexport interface WorkspaceLayout {\n palette: DockSide;\n structure: DockSide;\n properties: DockSide;\n /** Width of each dock rail, in pixels. */\n leftWidth: number;\n rightWidth: number;\n}\n\nexport const DEFAULT_LAYOUT: WorkspaceLayout = {\n palette: 'left',\n structure: 'left',\n properties: 'right',\n leftWidth: 240,\n rightWidth: 280,\n};\n\nexport interface WorkspacePreset {\n id: string;\n label: string;\n layout: WorkspaceLayout;\n}\n\n/** Ready-made arrangements offered in the workspace menu. */\nexport const WORKSPACE_PRESETS: WorkspacePreset[] = [\n { id: 'default', label: 'Default (fields left, properties right)', layout: DEFAULT_LAYOUT },\n {\n id: 'authoring',\n label: 'Authoring (everything left)',\n layout: { ...DEFAULT_LAYOUT, properties: 'left', leftWidth: 300 },\n },\n {\n id: 'inspect',\n label: 'Inspect (structure + properties right)',\n layout: { ...DEFAULT_LAYOUT, structure: 'right', properties: 'right', rightWidth: 320 },\n },\n {\n id: 'canvas',\n label: 'Canvas only (panels hidden)',\n layout: { ...DEFAULT_LAYOUT, palette: 'hidden', structure: 'hidden', properties: 'hidden' },\n },\n];\n\nexport const PANEL_LABELS: Record<PanelId, string> = {\n palette: 'Fields',\n structure: 'Structure',\n properties: 'Properties',\n};\n\nconst STORAGE_KEY = 'mform-designer-layout';\n\nexport function loadLayout(storage: Storage | null): WorkspaceLayout {\n if (!storage) return DEFAULT_LAYOUT;\n try {\n const raw = storage.getItem(STORAGE_KEY);\n if (!raw) return DEFAULT_LAYOUT;\n const parsed = JSON.parse(raw) as Partial<WorkspaceLayout>;\n return { ...DEFAULT_LAYOUT, ...parsed };\n } catch {\n return DEFAULT_LAYOUT;\n }\n}\n\nexport function saveLayout(storage: Storage | null, layout: WorkspaceLayout): void {\n try {\n storage?.setItem(STORAGE_KEY, JSON.stringify(layout));\n } catch {\n /* storage unavailable (private mode, SSR) — layout stays in memory */\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ViewEncapsulation,\n computed,\n effect,\n input,\n output,\n signal,\n untracked,\n} from '@angular/core';\nimport { JsonPipe, NgTemplateOutlet } from '@angular/common';\nimport {\n createFormEngine,\n duplicateNode,\n generateKey,\n getNodeAt,\n insertNode,\n moveNode,\n parentOf,\n removeNode,\n updateNode,\n validateSchema,\n type FieldNode,\n type FormEngine,\n type FormSchema,\n type NodePath,\n type SchemaDiagnostic,\n} from '@mosaicoo/form-core';\nimport { createLegacyImporter, importForm } from '@mosaicoo/form-core/interop';\nimport { FormRendererComponent } from '@mosaicoo/form-angular';\nimport { DesignerNodeComponent } from './designer-node.component.js';\nimport { InspectorComponent, type InspectorPatch } from './inspector.component.js';\nimport { DEFAULT_CATALOG, type CatalogEntry, type CatalogGroup } from './field-catalog.js';\nimport { loadBlocks, saveBlocks, type FormBlock } from './blocks.js';\nimport { DESIGNER_LABELS_EN, type DesignerLabels } from './designer-labels.js';\nimport { dropId, type DropTarget } from './drag-drop.js';\nimport {\n DEFAULT_LAYOUT,\n PANEL_LABELS,\n WORKSPACE_PRESETS,\n loadLayout,\n saveLayout,\n type DockSide,\n type PanelId,\n type WorkspaceLayout,\n} from './workspace.js';\n\nconst EMPTY_SCHEMA: FormSchema = { version: 1, fields: [] };\nconst HISTORY_LIMIT = 50;\n\n/** True when `target` is `from` itself or somewhere inside it. */\nfunction isSameOrInside(from: NodePath, target: NodePath): boolean {\n return from.every((segment, index) => target[index] === segment);\n}\n\n/**\n * A move removes before it inserts: when the source sits before the target\n * under the same parent, every index after it shifts down by one.\n */\nfunction adjustAfterRemoval(from: NodePath, target: NodePath): NodePath {\n const parentDepth = from.length - 1;\n const sameParent = from.slice(0, parentDepth).every((s, i) => target[i] === s);\n if (!sameParent || target.length < from.length) return target;\n const adjusted = [...target];\n const fromIndex = from[parentDepth]!;\n const targetIndex = adjusted[parentDepth]!;\n if (targetIndex > fromIndex) adjusted[parentDepth] = targetIndex - 1;\n return adjusted;\n}\n\n/** Deep copy of a block with fresh keys, so it can be inserted repeatedly. */\nfunction rekeyBlock(node: FieldNode, schema: FormSchema): FieldNode {\n const copy = JSON.parse(JSON.stringify(node)) as FieldNode;\n const assign = (target: FieldNode) => {\n target.key = generateKey(schema, target.key);\n if (target.kind === 'container') target.children.forEach(assign);\n };\n assign(copy);\n return copy;\n}\n\n/**\n * `<mform-designer>` — visual authoring of form schemas.\n *\n * The designer edits a DOCUMENT (the schema): every change goes through the\n * core's immutable edit operations, feeding undo/redo and `schemaChanged`.\n * Persistence, publishing and permissions belong to the host.\n */\n@Component({\n selector: 'mform-designer',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n DesignerNodeComponent,\n InspectorComponent,\n FormRendererComponent,\n JsonPipe,\n NgTemplateOutlet,\n ],\n styleUrls: ['./designer-theme.css'],\n template: `\n <div class=\"dz-shell\" (keydown)=\"onKeydown($event)\">\n <header class=\"dz-toolbar\">\n <div class=\"dz-tools\">\n <button type=\"button\" (click)=\"undo()\" [disabled]=\"past().length === 0\" [title]=\"labels().undo\">↶</button>\n <button type=\"button\" (click)=\"redo()\" [disabled]=\"future().length === 0\" [title]=\"labels().redo\">↷</button>\n <span class=\"dz-sep\"></span>\n <button type=\"button\" (click)=\"moveSelected(-1)\" [disabled]=\"!selected()\" [title]=\"labels().moveUp\">↑</button>\n <button type=\"button\" (click)=\"moveSelected(1)\" [disabled]=\"!selected()\" [title]=\"labels().moveDown\">↓</button>\n <button type=\"button\" (click)=\"unnestSelected()\" [disabled]=\"!canUnnest()\" [title]=\"labels().unnest\">⇤</button>\n <button type=\"button\" (click)=\"nestSelected()\" [disabled]=\"!canNest()\" [title]=\"labels().nest\">⇥</button>\n <button type=\"button\" (click)=\"duplicateSelected()\" [disabled]=\"!selected()\" [title]=\"labels().duplicate\">⧉</button>\n <button type=\"button\" (click)=\"removeSelected()\" [disabled]=\"!selected()\" [title]=\"labels().delete\">🗑</button>\n <button type=\"button\" (click)=\"saveAsBlock()\" [disabled]=\"!selected()\" [title]=\"labels().saveBlock\">⊞</button>\n </div>\n <div class=\"dz-tools\">\n @if (diagnostics().length > 0) {\n <button type=\"button\" class=\"dz-diag-badge\" (click)=\"showDiagnostics.set(!showDiagnostics())\">\n ⚠ {{ diagnostics().length }}\n </button>\n }\n <div class=\"dz-menu\">\n <button type=\"button\" (click)=\"workspaceMenu.set(!workspaceMenu())\" [title]=\"labels().workspace\">\n ▦ {{ labels().workspace }}\n </button>\n @if (workspaceMenu()) {\n <div class=\"dz-menu-panel\" role=\"menu\">\n <span class=\"dz-menu-title\">{{ labels().panels }}</span>\n @for (panel of panelIds; track panel) {\n <div class=\"dz-menu-row\">\n <span>{{ panelLabel(panel) }}</span>\n <span class=\"dz-seg\">\n @for (side of dockSides; track side) {\n <button\n type=\"button\"\n [class.is-on]=\"layout()[panel] === side\"\n (click)=\"dock(panel, side)\"\n >{{ sideLabels[side] }}</button>\n }\n </span>\n </div>\n }\n <span class=\"dz-menu-title\">{{ labels().presets }}</span>\n @for (preset of presets; track preset.id) {\n <button type=\"button\" class=\"dz-menu-item\" (click)=\"applyPreset(preset.id)\">\n {{ preset.label }}\n </button>\n }\n <button type=\"button\" class=\"dz-menu-item\" (click)=\"resetLayout()\">{{ labels().resetLayout }}</button>\n </div>\n }\n </div>\n <button type=\"button\" (click)=\"dialog.set(dialog() === 'import' ? null : 'import')\">{{ labels().import }}</button>\n <button type=\"button\" (click)=\"openExport()\">{{ labels().export }}</button>\n <button type=\"button\" class=\"dz-primary\" (click)=\"preview.set(!preview())\">\n {{ preview() ? labels().design : labels().preview }}\n </button>\n </div>\n </header>\n\n @if (showDiagnostics() && diagnostics().length > 0) {\n <div class=\"dz-diagnostics\" role=\"alert\">\n @for (diag of diagnostics(); track $index) {\n <div class=\"dz-diag\" [class.is-warning]=\"diag.severity === 'warning'\">\n <code>{{ diag.code }}</code> {{ diag.message }} <em>{{ diag.path }}</em>\n </div>\n }\n </div>\n }\n\n @if (dialog() === 'export') {\n <div class=\"dz-dialog\">\n <h4>{{ labels().exportTitle }}</h4>\n <textarea readonly rows=\"12\">{{ exportedJson() }}</textarea>\n <div class=\"dz-dialog-actions\">\n <button type=\"button\" (click)=\"dialog.set(null)\">{{ labels().close }}</button>\n </div>\n </div>\n }\n @if (dialog() === 'import') {\n <div class=\"dz-dialog\">\n <h4>{{ labels().importTitle }}</h4>\n <textarea rows=\"12\" #importArea [placeholder]=\"labels().importPlaceholder\"></textarea>\n @if (importError()) {\n <p class=\"dz-import-error\" role=\"alert\">{{ importError() }}</p>\n }\n <div class=\"dz-dialog-actions\">\n <button type=\"button\" (click)=\"dialog.set(null)\">{{ labels().cancel }}</button>\n <button type=\"button\" class=\"dz-primary\" (click)=\"doImport(importArea.value)\">{{ labels().import }}</button>\n </div>\n </div>\n }\n\n @if (preview()) {\n <div class=\"dz-preview\">\n <div class=\"dz-viewports\" role=\"group\" [attr.aria-label]=\"labels().viewport\">\n @for (option of viewports; track option.id) {\n <button\n type=\"button\"\n [class.is-on]=\"viewport() === option.id\"\n (click)=\"viewport.set(option.id)\"\n [title]=\"option.width ? option.label + ' · ' + option.width + 'px' : option.label\"\n >{{ option.icon }} {{ option.label }}</button>\n }\n </div>\n <div\n class=\"dz-preview-frame\"\n [class.is-constrained]=\"viewportWidth() !== null\"\n [style.max-width.px]=\"viewportWidth()\"\n >\n <mform-renderer [schema]=\"draft()\" (valueChanged)=\"previewData.set($event)\" />\n </div>\n <details class=\"dz-preview-data\">\n <summary>{{ labels().testData }}</summary>\n <pre>{{ previewData() | json }}</pre>\n </details>\n </div>\n } @else {\n <div\n class=\"dz-body\"\n [style.grid-template-columns]=\"bodyColumns()\"\n (pointermove)=\"onResizeMove($event)\"\n (pointerup)=\"endResize()\"\n (pointercancel)=\"endResize()\"\n >\n @if (dockedPanels('left').length > 0) {\n <aside class=\"dz-dock dz-dock-left\">\n @for (panel of dockedPanels('left'); track panel) {\n <ng-container *ngTemplateOutlet=\"panelTemplate; context: { $implicit: panel }\" />\n }\n <div\n class=\"dz-splitter dz-splitter-left\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n (pointerdown)=\"startResize('left', $event)\"\n ></div>\n </aside>\n }\n\n <main class=\"dz-canvas\" [class.is-dragging]=\"isDragging()\" (click)=\"select(null)\">\n @for (node of draft().fields; track node.key; let i = $index) {\n <div\n class=\"dz-dropzone\"\n [class.is-over]=\"isDropTarget({ path: [i] })\"\n (dragover)=\"allowDrop({ path: [i] }, $event)\"\n (drop)=\"drop({ path: [i] }, $event)\"\n ></div>\n <mform-designer-node\n [node]=\"node\"\n [path]=\"[i]\"\n [engine]=\"canvasEngine()\"\n [selected]=\"selected()\"\n [dragging]=\"isDragging()\"\n [activeDrop]=\"dropTarget()\"\n draggable=\"true\"\n (dragstart)=\"startNodeDrag([i], $event)\"\n (dragend)=\"endDrag()\"\n (selectNode)=\"select($event)\"\n (nodeDragStart)=\"startNodeDrag($event)\"\n (dragOverTarget)=\"allowDrop($event)\"\n (dropOnTarget)=\"drop($event)\"\n (dragFinished)=\"endDrag()\"\n />\n } @empty {\n <div class=\"dz-canvas-empty\">\n {{ labels().canvasEmpty }}\n </div>\n }\n <div\n class=\"dz-dropzone is-last\"\n [class.is-over]=\"isDropTarget({ path: [draft().fields.length] })\"\n (dragover)=\"allowDrop({ path: [draft().fields.length] }, $event)\"\n (drop)=\"drop({ path: [draft().fields.length] }, $event)\"\n ></div>\n </main>\n\n @if (dockedPanels('right').length > 0) {\n <aside class=\"dz-dock dz-dock-right\">\n <div\n class=\"dz-splitter dz-splitter-right\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n (pointerdown)=\"startResize('right', $event)\"\n ></div>\n @for (panel of dockedPanels('right'); track panel) {\n <ng-container *ngTemplateOutlet=\"panelTemplate; context: { $implicit: panel }\" />\n }\n </aside>\n }\n </div>\n }\n </div>\n\n <!-- One template per panel, rendered into whichever dock holds it. -->\n <ng-template #panelTemplate let-panel>\n <section class=\"dz-panel\" [attr.data-panel]=\"panel\">\n <header class=\"dz-panel-head\">\n <span>{{ panelLabel(panel) }}</span>\n <span class=\"dz-panel-actions\">\n <button\n type=\"button\"\n [title]=\"panelSide(panel) === 'left' ? labels().moveRight : labels().moveLeft\"\n (click)=\"dock(panel, panelSide(panel) === 'left' ? 'right' : 'left')\"\n >{{ panelSide(panel) === 'left' ? '⇥' : '⇤' }}</button>\n <button type=\"button\" [title]=\"labels().hidePanel\" (click)=\"dock(panel, 'hidden')\">✕</button>\n </span>\n </header>\n <div class=\"dz-panel-body\">\n @switch (panel) {\n @case ('palette') {\n @for (group of catalog(); track group.label) {\n <div class=\"dz-group\">\n <button\n type=\"button\"\n class=\"dz-group-toggle\"\n [class.is-open]=\"isGroupOpen(group.label)\"\n [attr.aria-expanded]=\"isGroupOpen(group.label)\"\n (click)=\"toggleGroup(group.label)\"\n >\n <span class=\"dz-caret\" aria-hidden=\"true\">{{ isGroupOpen(group.label) ? '▾' : '▸' }}</span>\n {{ group.label }}\n <span class=\"dz-group-count\">{{ group.entries.length }}</span>\n </button>\n @if (isGroupOpen(group.label)) {\n <div class=\"dz-group-entries\">\n @for (entry of group.entries; track entry.type) {\n <div class=\"dz-palette-row\">\n <button\n type=\"button\"\n class=\"dz-palette-item\"\n draggable=\"true\"\n (dragstart)=\"startEntryDrag(entry, $event)\"\n (dragend)=\"endDrag()\"\n (click)=\"add(entry)\"\n [title]=\"'Add ' + entry.label + ' (or drag onto the canvas)'\"\n >\n <span class=\"dz-icon\">{{ entry.icon }}</span>{{ entry.label }}\n </button>\n @if (isBlockEntry(entry)) {\n <button\n type=\"button\"\n class=\"dz-block-remove\"\n (click)=\"removeBlock(blockIdOf(entry))\"\n [attr.aria-label]=\"'Remove block ' + entry.label\"\n >✕</button>\n }\n </div>\n }\n </div>\n }\n </div>\n }\n }\n @case ('structure') {\n <div class=\"dz-tree\" role=\"tree\">\n @for (item of tree(); track item.id) {\n <button\n type=\"button\"\n role=\"treeitem\"\n class=\"dz-tree-item\"\n [class.is-selected]=\"isSelectedPath(item.path)\"\n [style.padding-left.px]=\"8 + item.depth * 14\"\n (click)=\"select(item.path)\"\n >\n {{ item.label }}\n </button>\n } @empty {\n <span class=\"dz-empty\">{{ labels().noFields }}</span>\n }\n </div>\n }\n @case ('properties') {\n @if (selectedNode(); as node) {\n <mform-inspector\n [node]=\"node\"\n [schema]=\"draft()\"\n (nodePatch)=\"applyPatch($event)\"\n />\n } @else {\n <div class=\"dz-empty dz-props-empty\">{{ labels().selectField }}</div>\n }\n }\n }\n </div>\n </section>\n </ng-template>\n `,\n})\nexport class FormDesignerComponent {\n /** Initial native schema to edit. */\n readonly schema = input<FormSchema | null>(null);\n /** Initial foreign definition (converted through importers). */\n readonly source = input<unknown>(null);\n /** Extra palette groups contributed by the host. */\n readonly extraCatalog = input<CatalogGroup[]>([]);\n /** Replaces the built-in palette (e.g. a translated DEFAULT_CATALOG). */\n readonly catalogOverride = input<CatalogGroup[] | null>(null, { alias: 'catalog' });\n /** Designer texts; partial overrides fall back to English. */\n readonly labels = input(DESIGNER_LABELS_EN, {\n transform: (value: Partial<DesignerLabels>) => ({ ...DESIGNER_LABELS_EN, ...value }),\n });\n\n /** Emitted after every committed edit (undo/redo included). */\n readonly schemaChanged = output<FormSchema>();\n\n readonly draft = signal<FormSchema>(EMPTY_SCHEMA);\n readonly past = signal<FormSchema[]>([]);\n readonly future = signal<FormSchema[]>([]);\n readonly selected = signal<NodePath | null>(null);\n readonly preview = signal(false);\n readonly previewData = signal<Record<string, unknown>>({});\n\n /** Preview viewport: the frame drives the form's container queries. */\n readonly viewport = signal<'desktop' | 'tablet' | 'mobile'>('desktop');\n readonly viewports: Array<{ id: 'desktop' | 'tablet' | 'mobile'; label: string; icon: string; width: number | null }> = [\n { id: 'desktop', label: 'Desktop', icon: '🖥', width: null },\n { id: 'tablet', label: 'Tablet', icon: '▭', width: 768 },\n { id: 'mobile', label: 'Mobile', icon: '▯', width: 375 },\n ];\n\n viewportWidth(): number | null {\n return this.viewports.find((option) => option.id === this.viewport())?.width ?? null;\n }\n readonly dialog = signal<'import' | 'export' | null>(null);\n readonly importError = signal('');\n readonly showDiagnostics = signal(false);\n\n // -- workspace ------------------------------------------------------------\n\n /** Panel arrangement; persisted locally unless the host controls it. */\n readonly layout = signal<WorkspaceLayout>(DEFAULT_LAYOUT);\n readonly workspaceMenu = signal(false);\n readonly panelIds: PanelId[] = ['palette', 'structure', 'properties'];\n readonly dockSides: DockSide[] = ['left', 'right', 'hidden'];\n readonly panelLabels = PANEL_LABELS;\n readonly sideLabels: Record<DockSide, string> = { left: '⇤', right: '⇥', hidden: '✕' };\n readonly presets = WORKSPACE_PRESETS;\n /** Collapsed palette groups (only the first stays open by default). */\n readonly openGroups = signal<Set<string>>(new Set());\n\n private readonly storage = (() => {\n try {\n return typeof localStorage === 'undefined' ? null : localStorage;\n } catch {\n return null;\n }\n })();\n\n panelLabel(panel: PanelId): string {\n const labels = this.labels();\n if (panel === 'palette') return labels.panelFields;\n if (panel === 'structure') return labels.panelStructure;\n return labels.panelProperties;\n }\n\n panelSide(panel: PanelId): DockSide {\n return this.layout()[panel];\n }\n\n dockedPanels(side: 'left' | 'right'): PanelId[] {\n const layout = this.layout();\n return this.panelIds.filter((panel) => layout[panel] === side);\n }\n\n bodyColumns(): string {\n const layout = this.layout();\n const left = this.dockedPanels('left').length > 0 ? `${layout.leftWidth}px ` : '';\n const right = this.dockedPanels('right').length > 0 ? ` ${layout.rightWidth}px` : '';\n return `${left}1fr${right}`;\n }\n\n dock(panel: PanelId, side: DockSide): void {\n this.layout.update((current) => ({ ...current, [panel]: side }));\n saveLayout(this.storage, this.layout());\n }\n\n applyPreset(id: string): void {\n const preset = WORKSPACE_PRESETS.find((p) => p.id === id);\n if (!preset) return;\n this.layout.set({ ...preset.layout });\n saveLayout(this.storage, this.layout());\n this.workspaceMenu.set(false);\n }\n\n resetLayout(): void {\n this.layout.set({ ...DEFAULT_LAYOUT });\n saveLayout(this.storage, this.layout());\n this.workspaceMenu.set(false);\n }\n\n /** Live drag state of a dock splitter. */\n private resizing: { side: 'left' | 'right'; startX: number; startWidth: number } | null = null;\n\n startResize(side: 'left' | 'right', event: PointerEvent): void {\n event.preventDefault();\n const layout = this.layout();\n this.resizing = {\n side,\n startX: event.clientX,\n startWidth: side === 'left' ? layout.leftWidth : layout.rightWidth,\n };\n (event.target as HTMLElement).setPointerCapture?.(event.pointerId);\n }\n\n onResizeMove(event: PointerEvent): void {\n const resizing = this.resizing;\n if (!resizing) return;\n // dragging right widens a left dock and narrows a right one\n const delta = event.clientX - resizing.startX;\n const raw = resizing.startWidth + (resizing.side === 'left' ? delta : -delta);\n const width = Math.max(160, Math.min(520, Math.round(raw)));\n this.layout.update((current) =>\n resizing.side === 'left' ? { ...current, leftWidth: width } : { ...current, rightWidth: width },\n );\n }\n\n endResize(): void {\n if (!this.resizing) return;\n this.resizing = null;\n saveLayout(this.storage, this.layout());\n }\n\n isGroupOpen(label: string): boolean {\n return this.openGroups().has(label);\n }\n\n toggleGroup(label: string): void {\n this.openGroups.update((open) => {\n const next = new Set(open);\n if (next.has(label)) next.delete(label);\n else next.add(label);\n return next;\n });\n }\n\n /** Saved blocks (host-controlled when `[blocks]` is bound). */\n readonly blocks = input<FormBlock[] | null>(null);\n readonly blocksChanged = output<FormBlock[]>();\n private readonly localBlocks = signal<FormBlock[]>([]);\n readonly effectiveBlocks = computed<FormBlock[]>(() => this.blocks() ?? this.localBlocks());\n\n /** Palette = built-ins + host extras + saved blocks as a group. */\n readonly catalog = computed<CatalogGroup[]>(() => {\n const groups = [...(this.catalogOverride() ?? DEFAULT_CATALOG), ...this.extraCatalog()];\n const blocks = this.effectiveBlocks();\n if (blocks.length > 0) {\n groups.push({\n label: 'Blocks',\n entries: blocks.map((block) => ({\n type: `block:${block.id}`,\n label: block.label,\n icon: '⊞',\n create: (schema: FormSchema) => rekeyBlock(block.node, schema),\n })),\n });\n }\n return groups;\n });\n readonly diagnostics = computed<SchemaDiagnostic[]>(() => validateSchema(this.draft()));\n readonly exportedJson = computed(() => JSON.stringify(this.draft(), null, 2));\n\n /** Disposable engine driving the canvas leaves (defaults visible). */\n readonly canvasEngine = computed<FormEngine>(() => createFormEngine(this.draft()));\n\n readonly selectedNode = computed<FieldNode | null>(() => {\n const path = this.selected();\n return path ? (getNodeAt(this.draft(), path) ?? null) : null;\n });\n\n /** Flat structure tree for navigation. */\n readonly tree = computed(() => {\n const items: Array<{ id: string; label: string; depth: number; path: NodePath }> = [];\n const visit = (nodes: FieldNode[], depth: number, prefix: NodePath) => {\n nodes.forEach((node, i) => {\n const path = [...prefix, i];\n items.push({\n id: path.join('.'),\n label: `${node.label ?? node.key} · ${node.type}`,\n depth,\n path,\n });\n if (node.kind === 'container') visit(node.children, depth + 1, path);\n });\n };\n visit(this.draft().fields, 0, []);\n return items;\n });\n\n constructor() {\n this.layout.set(loadLayout(this.storage));\n this.localBlocks.set(loadBlocks(this.storage));\n // First palette group starts expanded; the rest opens on demand.\n const first = this.catalog()[0]?.label;\n if (first) this.openGroups.set(new Set([first]));\n\n // (Re)load the document whenever the host hands a new definition in.\n effect(() => {\n const native = this.schema();\n const source = this.source();\n // Hosts often feed `schemaChanged` back into [schema] (controlled\n // usage) — the echo of our own draft must not reset history/selection.\n // `untracked` is essential: reading the draft as a dependency would make\n // every edit re-run this effect and revert the document.\n if (native && native === untracked(() => this.draft())) return;\n let initial = EMPTY_SCHEMA;\n if (native) {\n initial = native;\n } else if (source !== null && source !== undefined) {\n try {\n initial = importForm(source, [createLegacyImporter()]).schema;\n } catch {\n initial = EMPTY_SCHEMA;\n }\n }\n this.draft.set(initial);\n this.past.set([]);\n this.future.set([]);\n this.selected.set(null);\n });\n }\n\n // -- document mutation ----------------------------------------------------\n\n private commit(next: FormSchema): void {\n this.past.update((stack) => [...stack.slice(-(HISTORY_LIMIT - 1)), this.draft()]);\n this.future.set([]);\n this.draft.set(next);\n this.schemaChanged.emit(next);\n }\n\n undo(): void {\n const past = this.past();\n if (past.length === 0) return;\n this.future.update((stack) => [this.draft(), ...stack]);\n this.past.set(past.slice(0, -1));\n this.draft.set(past[past.length - 1]!);\n this.selected.set(null);\n this.schemaChanged.emit(this.draft());\n }\n\n redo(): void {\n const future = this.future();\n if (future.length === 0) return;\n this.past.update((stack) => [...stack, this.draft()]);\n this.future.set(future.slice(1));\n this.draft.set(future[0]!);\n this.selected.set(null);\n this.schemaChanged.emit(this.draft());\n }\n\n add(entry: CatalogEntry): void {\n const node = entry.create(this.draft());\n const target = this.insertionPath();\n this.commit(insertNode(this.draft(), target, node));\n this.select(target);\n }\n\n /** New nodes land inside a selected container, after a selected leaf, or at the end. */\n private insertionPath(): NodePath {\n const selected = this.selected();\n if (!selected) return [this.draft().fields.length];\n const node = getNodeAt(this.draft(), selected);\n if (node?.kind === 'container' && node.type !== 'columns') {\n return [...selected, node.children.length];\n }\n const { parent, index } = parentOf(selected);\n return [...parent, index + 1];\n }\n\n removeSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(removeNode(this.draft(), selected));\n this.selected.set(null);\n }\n\n duplicateSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(duplicateNode(this.draft(), selected));\n }\n\n moveSelected(delta: -1 | 1): void {\n const selected = this.selected();\n if (!selected) return;\n const { parent, index } = parentOf(selected);\n const siblings =\n parent.length === 0\n ? this.draft().fields\n : (getNodeAt(this.draft(), parent) as { children?: FieldNode[] })?.children ?? [];\n const target = index + delta;\n if (target < 0 || target >= siblings.length) return;\n this.commit(moveNode(this.draft(), selected, [...parent, target]));\n this.select([...parent, target]);\n }\n\n applyPatch(event: InspectorPatch): void {\n const selected = this.selected();\n if (!selected) return;\n this.commit(updateNode(this.draft(), selected, event.patch));\n }\n\n /** Whether the selection can be nested into the container above it. */\n canNest(): boolean {\n const selected = this.selected();\n if (!selected) return false;\n const { parent, index } = parentOf(selected);\n if (index === 0) return false;\n return getNodeAt(this.draft(), [...parent, index - 1])?.kind === 'container';\n }\n\n canUnnest(): boolean {\n return (this.selected()?.length ?? 0) > 1;\n }\n\n /**\n * Nests the selection into the container right above it (Alt+→) — the\n * keyboard equivalent of dragging a field into a panel.\n */\n nestSelected(): void {\n const selected = this.selected();\n if (!selected) return;\n const { parent, index } = parentOf(selected);\n if (index === 0) return;\n const previous = getNodeAt(this.draft(), [...parent, index - 1]);\n if (!previous || previous.kind !== 'container') return;\n // after the removal the container keeps its position (it sits before)\n const target = [...parent, index - 1, previous.children.length];\n this.commit(moveNode(this.draft(), selected, target));\n this.select(target);\n }\n\n /** Moves the selection out of its container, right after it (Alt+←). */\n unnestSelected(): void {\n const selected = this.selected();\n if (!selected || selected.length < 2) return;\n const { parent } = parentOf(selected);\n const { parent: grandparent, index: parentIndex } = parentOf(parent);\n const target = [...grandparent, parentIndex + 1];\n this.commit(moveNode(this.draft(), selected, target));\n this.select(target);\n }\n\n // -- reusable blocks ------------------------------------------------------\n\n /** Saves the selected node (with its subtree) as a reusable block. */\n saveAsBlock(): void {\n const selected = this.selected();\n const node = selected ? getNodeAt(this.draft(), selected) : null;\n if (!node) return;\n const label = node.label ?? node.key;\n const block: FormBlock = {\n id: `${node.key}-${this.effectiveBlocks().length + 1}`,\n label,\n node: JSON.parse(JSON.stringify(node)) as FieldNode,\n };\n const next = [...this.effectiveBlocks(), block];\n if (this.blocks() === null) {\n this.localBlocks.set(next);\n saveBlocks(this.storage, next);\n }\n this.blocksChanged.emit(next);\n }\n\n removeBlock(id: string): void {\n const next = this.effectiveBlocks().filter((block) => block.id !== id);\n if (this.blocks() === null) {\n this.localBlocks.set(next);\n saveBlocks(this.storage, next);\n }\n this.blocksChanged.emit(next);\n }\n\n isBlockEntry(entry: CatalogEntry): boolean {\n return entry.type.startsWith('block:');\n }\n\n blockIdOf(entry: CatalogEntry): string {\n return entry.type.slice('block:'.length);\n }\n\n // -- drag and drop --------------------------------------------------------\n\n /** What is being dragged: a palette entry or an existing node. */\n private readonly dragging = signal<\n { kind: 'entry'; entry: CatalogEntry } | { kind: 'node'; path: NodePath } | null\n >(null);\n /** Drop zone highlighted while hovering (see `dropId`). */\n readonly dropTarget = signal<string | null>(null);\n\n startEntryDrag(entry: CatalogEntry, event: DragEvent): void {\n this.dragging.set({ kind: 'entry', entry });\n event.dataTransfer?.setData('text/plain', entry.type);\n if (event.dataTransfer) event.dataTransfer.effectAllowed = 'copy';\n }\n\n startNodeDrag(path: NodePath, event?: DragEvent): void {\n this.dragging.set({ kind: 'node', path });\n event?.dataTransfer?.setData('text/plain', path.join('.'));\n if (event?.dataTransfer) event.dataTransfer.effectAllowed = 'move';\n }\n\n endDrag(): void {\n this.dragging.set(null);\n this.dropTarget.set(null);\n }\n\n allowDrop(target: DropTarget, event?: DragEvent): void {\n if (!this.dragging()) return;\n event?.preventDefault();\n event?.stopPropagation();\n this.dropTarget.set(dropId(target));\n }\n\n /** Drops onto `target` — the position (and column) the node should occupy. */\n drop(target: DropTarget, event?: DragEvent): void {\n event?.preventDefault();\n event?.stopPropagation();\n const dragging = this.dragging();\n this.endDrag();\n if (!dragging) return;\n const options = target.column === undefined ? undefined : { column: target.column };\n\n if (dragging.kind === 'entry') {\n const node = dragging.entry.create(this.draft());\n this.commit(insertNode(this.draft(), target.path, node, options));\n this.select(target.path);\n return;\n }\n const from = dragging.path;\n if (isSameOrInside(from, target.path)) return; // never drop a node into itself\n const adjusted = adjustAfterRemoval(from, target.path);\n this.commit(moveNode(this.draft(), from, adjusted, options));\n this.select(adjusted);\n }\n\n isDropTarget(target: DropTarget): boolean {\n return this.dropTarget() === dropId(target);\n }\n\n isDragging(): boolean {\n return this.dragging() !== null;\n }\n\n // -- selection ------------------------------------------------------------\n\n select(path: NodePath | null): void {\n this.selected.set(path);\n }\n\n isSelectedPath(path: NodePath): boolean {\n return this.selected()?.join('.') === path.join('.');\n }\n\n // -- import / export ------------------------------------------------------\n\n openExport(): void {\n this.dialog.set(this.dialog() === 'export' ? null : 'export');\n }\n\n doImport(raw: string): void {\n try {\n const parsed: unknown = JSON.parse(raw);\n const { schema } = importForm(parsed, [createLegacyImporter()]);\n this.commit(schema);\n this.selected.set(null);\n this.dialog.set(null);\n this.importError.set('');\n } catch (error) {\n this.importError.set(this.labels().importError + String(error));\n }\n }\n\n // -- keyboard -------------------------------------------------------------\n\n onKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement;\n if (['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName)) return;\n const key = event.key.toLowerCase();\n if (event.ctrlKey && key === 'z' && !event.shiftKey) {\n event.preventDefault();\n this.undo();\n } else if ((event.ctrlKey && key === 'y') || (event.ctrlKey && event.shiftKey && key === 'z')) {\n event.preventDefault();\n this.redo();\n } else if (event.ctrlKey && key === 'd') {\n event.preventDefault();\n this.duplicateSelected();\n } else if (key === 'delete') {\n event.preventDefault();\n this.removeSelected();\n } else if (key === 'escape') {\n event.preventDefault();\n this.workspaceMenu.set(false);\n this.dialog.set(null);\n this.select(null);\n } else if (event.altKey && key === 'arrowup') {\n event.preventDefault();\n this.moveSelected(-1);\n } else if (event.altKey && key === 'arrowdown') {\n event.preventDefault();\n this.moveSelected(1);\n } else if (event.altKey && key === 'arrowright') {\n event.preventDefault();\n this.nestSelected();\n } else if (event.altKey && key === 'arrowleft') {\n event.preventDefault();\n this.unnestSelected();\n }\n }\n}\n","/*\n * Designer entry point (`@mosaicoo/form-angular/designer`).\n *\n * Authoring lives behind this secondary entry so applications that only\n * RENDER forms never load designer code — required for federated hosts and\n * lazy loading.\n */\nexport { FormDesignerComponent } from './designer.component.js';\nexport { DesignerNodeComponent } from './designer-node.component.js';\nexport { InspectorComponent, type InspectorPatch } from './inspector.component.js';\nexport { DEFAULT_CATALOG, type CatalogEntry, type CatalogGroup } from './field-catalog.js';\nexport type { FormBlock } from './blocks.js';\nexport { DESIGNER_LABELS_EN, type DesignerLabels } from './designer-labels.js';\nexport { dropId, type DropTarget } from './drag-drop.js';\nexport {\n DEFAULT_LAYOUT,\n PANEL_LABELS,\n WORKSPACE_PRESETS,\n type DockSide,\n type PanelId,\n type WorkspaceLayout,\n type WorkspacePreset,\n} from './workspace.js';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["input","STORAGE_KEY"],"mappings":";;;;;;;AAaM,SAAU,MAAM,CAAC,MAAkB,EAAA;AACvC,IAAA,OAAO,MAAM,CAAC,MAAM,KAAK;UACrB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;AACtB,UAAE,CAAA,EAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,MAAM,EAAE;AACjD;;ACLA;;;;;;;;AAQG;MAyIU,qBAAqB,CAAA;AACvB,IAAA,IAAI,GAAGA,OAAK,CAAC,QAAQ,0EAAa;AAClC,IAAA,IAAI,GAAGA,OAAK,CAAC,QAAQ,0EAAY;AACjC,IAAA,MAAM,GAAGA,OAAK,CAAC,QAAQ,4EAAc;AACrC,IAAA,QAAQ,GAAGA,OAAK,CAAkB,IAAI,+EAAC;;AAEvC,IAAA,QAAQ,GAAGA,OAAK,CAAU,KAAK,+EAAC;;AAEhC,IAAA,UAAU,GAAGA,OAAK,CAAgB,IAAI,iFAAC;IAEvC,UAAU,GAAG,MAAM,EAAY;IAC/B,aAAa,GAAG,MAAM,EAAY;IAClC,cAAc,GAAG,MAAM,EAAc;IACrC,YAAY,GAAG,MAAM,EAAc;IACnC,YAAY,GAAG,MAAM,EAAQ;AAE7B,IAAA,SAAS,GAAG,MAAM,CAAC,CAAC,gFAAC;IAE9B,SAAS,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,IAAI,EAAoB;IACtC;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG;AACpC,QAAA,OAAO,GAAG,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,IAAI,EAAE;IAClC;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,OAAO,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;IAC1E;AAEA,IAAA,SAAS,CAAC,KAAa,EAAA;QACrB,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC;IAChC;IAEA,eAAe,GAAA;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC,OAAO,IAAI,EAAE;QAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE;AAChE,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA,EAAA,CAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IAClF;AAEA,IAAA,QAAQ,CAAC,KAAY,EAAA;QACnB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACnC;IAEA,MAAM,CAAC,KAAa,EAAE,KAAY,EAAA;QAChC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;IAC3B;;IAIA,MAAM,CAAC,IAAc,EAAE,MAAe,EAAA;AACpC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACvD;IAEA,WAAW,CAAC,IAAc,EAAE,KAAY,EAAA;QACtC,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,UAAU,CAAC,IAAc,EAAE,MAA0B,EAAE,KAAgB,EAAA;AACrE,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;QACtB,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5C;AAEA,IAAA,MAAM,CAAC,IAAc,EAAE,MAA0B,EAAE,KAAgB,EAAA;QACjE,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;QACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC1C;wGA3EW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAnItB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiIT,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEU,qBAAqB,sOApItB,iBAAiB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MAAA,EAAA,QAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAoIhB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAxIjC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;oBAC/B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;oBACrC,OAAO,EAAE,CAAC,iBAAiB,CAAC;AAC5B,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiIT,EAAA,CAAA;AACF,iBAAA;;;AClID;;;AAGG;MAoMU,kBAAkB,CAAA;AACpB,IAAA,IAAI,GAAGA,OAAK,CAAC,QAAQ,0EAAa;AAClC,IAAA,MAAM,GAAGA,OAAK,CAAC,QAAQ,4EAAc;IACrC,SAAS,GAAG,MAAM,EAAkB;IAE7C,KAAK,GAAA;AACH,QAAA,OAAO,IAAI,CAAC,IAAI,EAAgB;IAClC;IAEA,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,IAAI,EAAiB;IACnC;IAEA,UAAU,GAAA;AACR,QAAA,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;IACzE;AAES,IAAA,eAAe,GAAG,QAAQ,CAAC,MAClC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE;SACxB,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI;AACzB,SAAA,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,sFACzC;AAEO,IAAA,SAAS,CAAC,KAAyB,EAAA;QACzC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;IAChC;AAEQ,IAAA,UAAU,CAAC,KAAY,EAAA;AAC7B,QAAA,OAAQ,KAAK,CAAC,MAAqE,CAAC,KAAK;IAC3F;IAEA,SAAS,CAAC,MAAmE,EAAE,KAAY,EAAA;QACzF,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAC3C,QAAA,IAAI,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,EAAE;AAAE,YAAA,OAAO;QAC7C,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,KAAK,EAAE,GAAG,SAAS,GAAG,KAAK,EAAwB,CAAC;IACtF;IAEA,SAAS,CAAC,MAA6B,EAAE,KAAY,EAAA;AACnD,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;AAC1D,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAwB,CAAC;IAChF;IAEA,gBAAgB,GAAA;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,YAAY;AACvC,QAAA,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACnE;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AAClC,QAAA,IAAI,GAAG,KAAK,EAAE,EAAE;YACd,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,SAAS,EAAwB,CAAC;YACjE;QACF;AACA,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;QAC1B,IAAI,KAAK,GAAY,GAAG;AACxB,QAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ;AAAE,YAAA,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AACpD,QAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;AAAE,YAAA,KAAK,GAAG,GAAG,KAAK,MAAM;QACxD,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,EAAwB,CAAC;IAC/D;;IAIQ,UAAU,GAAA;QAChB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,UAAU,IAAI,EAAE;IACtC;IAEA,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;IAC7D;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;AACzB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;QACnE,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACvE;AAEA,IAAA,cAAc,CAAC,IAA+C,EAAA;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAC3D,QAAA,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;IAC1D;IAEA,cAAc,CAAC,IAA+C,EAAE,KAAY,EAAA;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClF;IAEA,YAAY,GAAA;QACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAChE,QAAA,OAAO,IAAI,IAAI,OAAO,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;IAC1D;AAEA,IAAA,YAAY,CAAC,KAAY,EAAA;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAClE,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,KAAK,EAAE,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IACrF;AAEQ,IAAA,cAAc,CAAC,UAA2B,EAAA;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,GAAG,SAAS,EAAwB,CAAC;IAClG;;AAIA,IAAA,WAAW,CAAC,KAAa,EAAE,MAAyB,EAAE,KAAY,EAAA;AAChE,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAE,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AACzE,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAwB,CAAC;IACnD;IAEA,SAAS,GAAA;AACP,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAA,OAAA,EAAU,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAA,MAAA,EAAS,OAAO,CAAC,MAAM,GAAG,CAAC,CAAA,CAAE,EAAE,CAAC;AAC7F,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAwB,CAAC;IACnD;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;QACxB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;AAC1E,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,OAAO,GAAG,SAAS,EAAwB,CAAC;IACzF;;IAIA,YAAY,GAAA;QACV,OAAO,CAAE,IAAI,CAAC,IAAI,EAAqB,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IACvF;AAEA,IAAA,iBAAiB,CAAC,KAAY,EAAA;AAC5B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAoB;AAC/C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK;aACjC,KAAK,CAAC,GAAG;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;AACjC,aAAA,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AACzD,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE;AACzB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,IAAI,EAAE;AACxC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM;YACxC,KAAK;YACL,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE;AACtC,SAAA,CAAC,CAAC;;AAEH,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACpD,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC;QACtE;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAwB,CAAC;IACnD;;IAIA,eAAe,GAAA;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW;AACzC,QAAA,OAAO,SAAS,IAAI,OAAO,IAAI,SAAS,GAAG,SAAS,GAAG,IAAI;IAC7D;IAEA,mBAAmB,GAAA;QACjB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW;AACzC,QAAA,OAAO,SAAS,IAAI,YAAY,IAAI,SAAS,GAAG,SAAS,CAAC,UAAU,GAAG,EAAE;IAC3E;IAEA,kBAAkB,GAAA;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK;AAC3C,QAAA,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACnE;AAEA,IAAA,mBAAmB,CAAC,KAAY,EAAA;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,KAAK,KAAK,EAAE,EAAE;YAChB,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC;YAC1C;QACF;AACA,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,MAAM,WAAW,GAAc;AAC7B,YAAA,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;AAC3B,YAAA,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;YACvB,KAAK;AACL,YAAA,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE;SAC5B;AACD,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;IACjC;AAEA,IAAA,mBAAmB,CAAC,KAAY,EAAA;AAC9B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE;AACtC,QAAA,IAAI,CAAC,OAAO;YAAE;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QAClC,MAAM,KAAK,GAAY,GAAG,KAAK,MAAM,GAAG,IAAI,GAAG,GAAG,KAAK,OAAO,GAAG,KAAK,GAAG,GAAG;AAC5E,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC;IACxD;AAEA,IAAA,wBAAwB,CAAC,KAAY,EAAA;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAChD,QAAA,IAAI,UAAU,KAAK,EAAE,EAAE;;AAErB,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,eAAe,EAAE,IAAI,SAAS,EAAE,CAAC;YACpE;QACF;AACA,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,CAAC;IAC7D;;AAIA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,KAAK,EAAE,GAAG,SAAS,GAAG,UAAU,EAAwB,CAAC;IACjG;AAEA,IAAA,SAAS,CAAC,KAAY,EAAA;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;QAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,KAAK,EAAE,GAAG,SAAS,GAAG,EAAE,IAAI,EAAE,EAAwB,CAAC;IACtF;AAEA,IAAA,aAAa,CAAC,KAAY,EAAA;AACxB,QAAA,MAAM,OAAO,GAAI,KAAK,CAAC,MAA2B,CAAC,OAAO;QAC1D,IAAI,CAAC,SAAS,CAAC;YACb,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS;YACpC,QAAQ,EAAE,OAAO,GAAG,OAAO,GAAG,QAAQ;AACjB,SAAA,CAAC;IAC1B;;IAIA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,IAAI,IAAI,EAAE;IAC/C;IAEA,YAAY,GAAA;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa;AACzC,QAAA,OAAO,MAAM,EAAE,IAAI,KAAK,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,EAAE;IACvD;IAEA,SAAS,GAAA;QACP,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa;AACzC,QAAA,OAAO,MAAM,EAAE,IAAI,KAAK,QAAQ,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE;IACpD;IAEA,SAAS,GAAA;QACP,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,SAAS,IAAI,EAAE;IACpD;AAEA,IAAA,eAAe,CAAC,KAAY,EAAA;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACnC,QAAA,IAAI,IAAI,KAAK,UAAU,EAAE;YACvB,IAAI,CAAC,SAAS,CAAC;AACb,gBAAA,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE;AAC7D,aAAA,CAAC;QAC1B;AAAO,aAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;YAC5B,IAAI,CAAC,SAAS,CAAC;AACb,gBAAA,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE;AACnC,aAAA,CAAC;QAC1B;aAAO;YACL,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,SAAS,EAAwB,CAAC;QACpE;IACF;AAEA,IAAA,iBAAiB,CAAC,KAAY,EAAA;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;QAC1C,IAAI,IAAI,KAAK,EAAE;YAAE;QACjB,IAAI,CAAC,SAAS,CAAC;AACb,YAAA,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;AACnD,SAAA,CAAC;IAC1B;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;QACzC,IAAI,CAAC,SAAS,CAAC;AACb,YAAA,aAAa,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE;AAChD,SAAA,CAAC;IAC1B;AAEA,IAAA,cAAc,CAAC,KAAY,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,aAAa;AACzC,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AAC/C,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE;QAC1B,IAAI,SAAS,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,SAAS;;AACtC,YAAA,IAAI,CAAC,SAAS,GAAG,SAAS;QAC/B,IAAI,CAAC,SAAS,CAAC,EAAE,aAAa,EAAE,IAAI,EAAwB,CAAC;IAC/D;;AAIS,IAAA,UAAU,GAAG,MAAM,CAAC,EAAE,iFAAC;IAEhC,QAAQ,GAAA;AACN,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC;IACxD;IAEA,SAAS,GAAA;QACP,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK;AAC/B,QAAA,OAAO,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;IACrF;AAEA,IAAA,UAAU,CAAC,KAAY,EAAA;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;AACzC,QAAA,IAAI,GAAG,KAAK,EAAE,EAAE;AACd,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;YACpC;QACF;AACA,QAAA,IAAI;YACF,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC1E,gBAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,8BAA8B,CAAC;gBACnD;YACF;AACA,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,MAAiC,EAAE,CAAC;QAC9D;QAAE,OAAO,KAAK,EAAE;YACd,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,gBAAgB,GAAG,MAAM,CAAC,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QAChG;IACF;wGApTW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA/LnB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6LT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAEU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAnM9B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;oBAC/C,aAAa,EAAE,iBAAiB,CAAC,IAAI;AACrC,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6LT,EAAA,CAAA;AACF,iBAAA;;;ACzMD,SAAS,KAAK,CACZ,IAAY,EACZ,QAAuE,EACvE,KAAa,EACb,KAAsD,EAAA;AAEtD,IAAA,OAAO,CAAC,MAAM,MAAM;AAClB,QAAA,IAAI,EAAE,OAAO;AACb,QAAA,GAAG,EAAE,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC;QAC9B,IAAI;QACJ,KAAK;QACL,QAAQ;AACR,QAAA,GAAG,KAAK;AACT,KAAA,CAAC;AACJ;AAEO,MAAM,eAAe,GAAmB;AAC7C,IAAA;AACE,QAAA,KAAK,EAAE,OAAO;AACd,QAAA,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;YACpF,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,CAAC,EAAE;YACrG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;YAC3F,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;YACnG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;AACpG,YAAA,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE;YAC5H,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;YACvF,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE;AACrG,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,SAAS;AAChB,QAAA,OAAO,EAAE;AACP,YAAA;gBACE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG;gBAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;AACpE,wBAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;AACjF,qBAAA,EAAgB,CAAA;AAClB,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;gBACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;AAClE,wBAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;AACjF,qBAAA,EAAgB,CAAA;AAClB,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,GAAG;gBAC1D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE;AACpF,wBAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;AACjF,qBAAA,EAAgB,CAAA;AAClB,aAAA;YACD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;AAClF,YAAA;gBACE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;AAChD,gBAAA,MAAM,EAAE,CAAC,CAAC,MAAM;oBACd,GAAG,KAAK,CAAC,WAAW,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;oBAC/C,aAAa,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE;iBACzC,CAAA;AAChB,aAAA;AACF,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,cAAc;AACrB,QAAA,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE;YACxG,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;YACjF,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnF,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE;AACpF,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,OAAO,EAAE;AACP,YAAA;gBACE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG;gBACxC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO;oBAC9E,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACxD,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG;gBAC5C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS;oBAClF,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE;AAC3C,wBAAA,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;AACvD,qBAAA,EAAE,CAAC;AACP,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG;AACtC,gBAAA,MAAM,EAAE,CAAC,CAAC,KAAI;oBACZ,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;AAClC,oBAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;4BAC7E,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,MAAA,CAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;4BAC7G,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,MAAA,CAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9G,yBAAA,EAAE;gBACL,CAAC;AACF,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;AAChD,gBAAA,MAAM,EAAE,CAAC,CAAC,KAAI;oBACZ,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC;AACvC,oBAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE;4BAClF,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;4BACrH,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA,EAAG,GAAG,CAAA,UAAA,CAAY,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;AACtH,yBAAA,EAAE;gBACL,CAAC;AACF,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG;gBAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO;oBAC9E,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACvD,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,GAAG;gBAC/C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU;oBACpF,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1D,aAAA;AACF,SAAA;AACF,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,QAAQ;AACf,QAAA,OAAO,EAAE;AACP,YAAA;gBACE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI;gBAC7C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS;oBAC/E,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAC/B,aAAA;AACD,YAAA;gBACE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG;gBACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAQ;oBAC7E,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,CAAC;AAClD,aAAA;AACF,SAAA;AACF,KAAA;;;ACxIH,MAAMC,aAAW,GAAG,uBAAuB;AAErC,SAAU,UAAU,CAAC,OAAuB,EAAA;AAChD,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,EAAE;AACvB,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAACA,aAAW,CAAC;AACxC,QAAA,MAAM,MAAM,GAAY,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;AAClD,QAAA,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAI,MAAsB,GAAG,EAAE;IAC7D;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,EAAE;IACX;AACF;AAEM,SAAU,UAAU,CAAC,OAAuB,EAAE,MAAmB,EAAA;AACrE,IAAA,IAAI;AACF,QAAA,OAAO,EAAE,OAAO,CAACA,aAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD;AAAE,IAAA,MAAM;;IAER;AACF;;ACQO,MAAM,kBAAkB,GAAmB;AAChD,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,MAAM,EAAE,iBAAiB;AACzB,IAAA,QAAQ,EAAE,mBAAmB;AAC7B,IAAA,IAAI,EAAE,uCAAuC;AAC7C,IAAA,MAAM,EAAE,mCAAmC;AAC3C,IAAA,SAAS,EAAE,oBAAoB;AAC/B,IAAA,MAAM,EAAE,cAAc;AACtB,IAAA,SAAS,EAAE,wBAAwB;AACnC,IAAA,QAAQ,EAAE,eAAe;AACzB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,WAAW,EAAE,cAAc;AAC3B,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,SAAS,EAAE,YAAY;AACvB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,OAAO,EAAE,SAAS;AAClB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,WAAW,EAAE,wDAAwD;AACrE,IAAA,iBAAiB,EAAE,mDAAmD;AACtE,IAAA,WAAW,EAAE,oBAAoB;AACjC,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,WAAW,EAAE,qEAAqE;AAClF,IAAA,WAAW,EAAE,wCAAwC;AACrD,IAAA,QAAQ,EAAE,WAAW;AACrB,IAAA,WAAW,EAAE,QAAQ;AACrB,IAAA,cAAc,EAAE,WAAW;AAC3B,IAAA,eAAe,EAAE,YAAY;AAC7B,IAAA,QAAQ,EAAE,eAAe;;;AC/E3B;;;;;;;AAOG;AAgBI,MAAM,cAAc,GAAoB;AAC7C,IAAA,OAAO,EAAE,MAAM;AACf,IAAA,SAAS,EAAE,MAAM;AACjB,IAAA,UAAU,EAAE,OAAO;AACnB,IAAA,SAAS,EAAE,GAAG;AACd,IAAA,UAAU,EAAE,GAAG;;AASjB;AACO,MAAM,iBAAiB,GAAsB;IAClD,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,yCAAyC,EAAE,MAAM,EAAE,cAAc,EAAE;AAC3F,IAAA;AACE,QAAA,EAAE,EAAE,WAAW;AACf,QAAA,KAAK,EAAE,6BAA6B;AACpC,QAAA,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;AAClE,KAAA;AACD,IAAA;AACE,QAAA,EAAE,EAAE,SAAS;AACb,QAAA,KAAK,EAAE,wCAAwC;AAC/C,QAAA,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE;AACxF,KAAA;AACD,IAAA;AACE,QAAA,EAAE,EAAE,QAAQ;AACZ,QAAA,KAAK,EAAE,6BAA6B;AACpC,QAAA,MAAM,EAAE,EAAE,GAAG,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE;AAC5F,KAAA;;AAGI,MAAM,YAAY,GAA4B;AACnD,IAAA,OAAO,EAAE,QAAQ;AACjB,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,UAAU,EAAE,YAAY;;AAG1B,MAAM,WAAW,GAAG,uBAAuB;AAErC,SAAU,UAAU,CAAC,OAAuB,EAAA;AAChD,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,cAAc;AACnC,IAAA,IAAI;QACF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;AACxC,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,cAAc;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA6B;AAC1D,QAAA,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE;IACzC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,cAAc;IACvB;AACF;AAEM,SAAU,UAAU,CAAC,OAAuB,EAAE,MAAuB,EAAA;AACzE,IAAA,IAAI;AACF,QAAA,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvD;AAAE,IAAA,MAAM;;IAER;AACF;;ACnCA,MAAM,YAAY,GAAe,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;AAC3D,MAAM,aAAa,GAAG,EAAE;AAExB;AACA,SAAS,cAAc,CAAC,IAAc,EAAE,MAAgB,EAAA;AACtD,IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC;AAClE;AAEA;;;AAGG;AACH,SAAS,kBAAkB,CAAC,IAAc,EAAE,MAAgB,EAAA;AAC1D,IAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,MAAM;AAC7D,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC;AAC5B,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAE;AACpC,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAE;IAC1C,IAAI,WAAW,GAAG,SAAS;AAAE,QAAA,QAAQ,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,CAAC;AACpE,IAAA,OAAO,QAAQ;AACjB;AAEA;AACA,SAAS,UAAU,CAAC,IAAe,EAAE,MAAkB,EAAA;AACrD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAc;AAC1D,IAAA,MAAM,MAAM,GAAG,CAAC,MAAiB,KAAI;QACnC,MAAM,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC;AAC5C,QAAA,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;AAAE,YAAA,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;AAClE,IAAA,CAAC;IACD,MAAM,CAAC,IAAI,CAAC;AACZ,IAAA,OAAO,IAAI;AACb;AAEA;;;;;;AAMG;MA6SU,qBAAqB,CAAA;;AAEvB,IAAA,MAAM,GAAGD,OAAK,CAAoB,IAAI,6EAAC;;AAEvC,IAAA,MAAM,GAAGA,OAAK,CAAU,IAAI,6EAAC;;AAE7B,IAAA,YAAY,GAAGA,OAAK,CAAiB,EAAE,mFAAC;;IAExC,eAAe,GAAGA,OAAK,CAAwB,IAAI,uFAAI,KAAK,EAAE,SAAS,EAAA,CAAG;;IAE1E,MAAM,GAAGA,OAAK,CAAC,kBAAkB,8EACxC,SAAS,EAAE,CAAC,KAA8B,MAAM,EAAE,GAAG,kBAAkB,EAAE,GAAG,KAAK,EAAE,CAAC,EAAA,CACpF;;IAGO,aAAa,GAAG,MAAM,EAAc;AAEpC,IAAA,KAAK,GAAG,MAAM,CAAa,YAAY,4EAAC;AACxC,IAAA,IAAI,GAAG,MAAM,CAAe,EAAE,2EAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAe,EAAE,6EAAC;AACjC,IAAA,QAAQ,GAAG,MAAM,CAAkB,IAAI,+EAAC;AACxC,IAAA,OAAO,GAAG,MAAM,CAAC,KAAK,8EAAC;AACvB,IAAA,WAAW,GAAG,MAAM,CAA0B,EAAE,kFAAC;;AAGjD,IAAA,QAAQ,GAAG,MAAM,CAAkC,SAAS,+EAAC;AAC7D,IAAA,SAAS,GAAsG;AACtH,QAAA,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;AAC5D,QAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;AACxD,QAAA,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;KACzD;IAED,aAAa,GAAA;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,IAAI,IAAI;IACtF;AACS,IAAA,MAAM,GAAG,MAAM,CAA6B,IAAI,6EAAC;AACjD,IAAA,WAAW,GAAG,MAAM,CAAC,EAAE,kFAAC;AACxB,IAAA,eAAe,GAAG,MAAM,CAAC,KAAK,sFAAC;;;AAK/B,IAAA,MAAM,GAAG,MAAM,CAAkB,cAAc,6EAAC;AAChD,IAAA,aAAa,GAAG,MAAM,CAAC,KAAK,oFAAC;IAC7B,QAAQ,GAAc,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC;IAC5D,SAAS,GAAe,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;IACnD,WAAW,GAAG,YAAY;AAC1B,IAAA,UAAU,GAA6B,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC7E,OAAO,GAAG,iBAAiB;;AAE3B,IAAA,UAAU,GAAG,MAAM,CAAc,IAAI,GAAG,EAAE,iFAAC;IAEnC,OAAO,GAAG,CAAC,MAAK;AAC/B,QAAA,IAAI;AACF,YAAA,OAAO,OAAO,YAAY,KAAK,WAAW,GAAG,IAAI,GAAG,YAAY;QAClE;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF,CAAC,GAAG;AAEJ,IAAA,UAAU,CAAC,KAAc,EAAA;AACvB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC,WAAW;QAClD,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO,MAAM,CAAC,cAAc;QACvD,OAAO,MAAM,CAAC,eAAe;IAC/B;AAEA,IAAA,SAAS,CAAC,KAAc,EAAA;AACtB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;IAC7B;AAEA,IAAA,YAAY,CAAC,IAAsB,EAAA;AACjC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC;IAChE;IAEA,WAAW,GAAA;AACT,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,EAAG,MAAM,CAAC,SAAS,KAAK,GAAG,EAAE;QACjF,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,CAAA,EAAI,MAAM,CAAC,UAAU,IAAI,GAAG,EAAE;AACpF,QAAA,OAAO,CAAA,EAAG,IAAI,CAAA,GAAA,EAAM,KAAK,EAAE;IAC7B;IAEA,IAAI,CAAC,KAAc,EAAE,IAAc,EAAA;QACjC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,KAAK,GAAG,IAAI,EAAE,CAAC,CAAC;QAChE,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;AACpB,QAAA,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;AACzD,QAAA,IAAI,CAAC,MAAM;YAAE;AACb,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QACrC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;IAEA,WAAW,GAAA;QACT,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,cAAc,EAAE,CAAC;QACtC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B;;IAGQ,QAAQ,GAA0E,IAAI;IAE9F,WAAW,CAAC,IAAsB,EAAE,KAAmB,EAAA;QACrD,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;QAC5B,IAAI,CAAC,QAAQ,GAAG;YACd,IAAI;YACJ,MAAM,EAAE,KAAK,CAAC,OAAO;AACrB,YAAA,UAAU,EAAE,IAAI,KAAK,MAAM,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,UAAU;SACnE;QACA,KAAK,CAAC,MAAsB,CAAC,iBAAiB,GAAG,KAAK,CAAC,SAAS,CAAC;IACpE;AAEA,IAAA,YAAY,CAAC,KAAmB,EAAA;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;AAC9B,QAAA,IAAI,CAAC,QAAQ;YAAE;;QAEf,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,GAAG,KAAK,GAAG,CAAC,KAAK,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,KACzB,QAAQ,CAAC,IAAI,KAAK,MAAM,GAAG,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAChG;IACH;IAEA,SAAS,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACzC;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC;AAEA,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC9B,YAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;AAClC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;IACJ;;AAGS,IAAA,MAAM,GAAGA,OAAK,CAAqB,IAAI,6EAAC;IACxC,aAAa,GAAG,MAAM,EAAe;AAC7B,IAAA,WAAW,GAAG,MAAM,CAAc,EAAE,kFAAC;AAC7C,IAAA,eAAe,GAAG,QAAQ,CAAc,MAAM,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,sFAAC;;AAGlF,IAAA,OAAO,GAAG,QAAQ,CAAiB,MAAK;AAC/C,QAAA,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,IAAI,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AACvF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE;AACrC,QAAA,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACrB,MAAM,CAAC,IAAI,CAAC;AACV,gBAAA,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,MAAM;AAC9B,oBAAA,IAAI,EAAE,CAAA,MAAA,EAAS,KAAK,CAAC,EAAE,CAAA,CAAE;oBACzB,KAAK,EAAE,KAAK,CAAC,KAAK;AAClB,oBAAA,IAAI,EAAE,GAAG;AACT,oBAAA,MAAM,EAAE,CAAC,MAAkB,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;AAC/D,iBAAA,CAAC,CAAC;AACJ,aAAA,CAAC;QACJ;AACA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,8EAAC;AACO,IAAA,WAAW,GAAG,QAAQ,CAAqB,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,kFAAC;IAC9E,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,mFAAC;;AAGpE,IAAA,YAAY,GAAG,QAAQ,CAAa,MAAM,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,mFAAC;AAEzE,IAAA,YAAY,GAAG,QAAQ,CAAmB,MAAK;AACtD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE;QAC5B,OAAO,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI;AAC9D,IAAA,CAAC,mFAAC;;AAGO,IAAA,IAAI,GAAG,QAAQ,CAAC,MAAK;QAC5B,MAAM,KAAK,GAAwE,EAAE;QACrF,MAAM,KAAK,GAAG,CAAC,KAAkB,EAAE,KAAa,EAAE,MAAgB,KAAI;YACpE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;gBACxB,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC;AACT,oBAAA,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAClB,oBAAA,KAAK,EAAE,CAAA,EAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAA,GAAA,EAAM,IAAI,CAAC,IAAI,CAAA,CAAE;oBACjD,KAAK;oBACL,IAAI;AACL,iBAAA,CAAC;AACF,gBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;oBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,CAAC;AACtE,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;AACjC,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,2EAAC;AAEF,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACzC,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;QAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK;AACtC,QAAA,IAAI,KAAK;AAAE,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;;QAGhD,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;;;;;AAK5B,YAAA,IAAI,MAAM,IAAI,MAAM,KAAK,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;gBAAE;YACxD,IAAI,OAAO,GAAG,YAAY;YAC1B,IAAI,MAAM,EAAE;gBACV,OAAO,GAAG,MAAM;YAClB;iBAAO,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS,EAAE;AAClD,gBAAA,IAAI;AACF,oBAAA,OAAO,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,MAAM;gBAC/D;AAAE,gBAAA,MAAM;oBACN,OAAO,GAAG,YAAY;gBACxB;YACF;AACA,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;AACvB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACjB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,CAAC,CAAC;IACJ;;AAIQ,IAAA,MAAM,CAAC,IAAgB,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACjF,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,QAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE;QACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC;AACtC,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACvC;IAEA,IAAI,GAAA;AACF,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAC5B,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE;QACzB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACvC;AAEA,IAAA,GAAG,CAAC,KAAmB,EAAA;QACrB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AACvC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE;AACnC,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACrB;;IAGQ,aAAa,GAAA;AACnB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;QAClD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC;AAC9C,QAAA,IAAI,IAAI,EAAE,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;YACzD,OAAO,CAAC,GAAG,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C;QACA,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5C,OAAO,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC;IAC/B;IAEA,cAAc,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;IAEA,iBAAiB,GAAA;AACf,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;IACpD;AAEA,IAAA,YAAY,CAAC,KAAa,EAAA;AACxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;AAC5C,QAAA,MAAM,QAAQ,GACZ,MAAM,CAAC,MAAM,KAAK;AAChB,cAAE,IAAI,CAAC,KAAK,EAAE,CAAC;AACf,cAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAgC,EAAE,QAAQ,IAAI,EAAE;AACrF,QAAA,MAAM,MAAM,GAAG,KAAK,GAAG,KAAK;QAC5B,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,IAAI,QAAQ,CAAC,MAAM;YAAE;QAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC;AAEA,IAAA,UAAU,CAAC,KAAqB,EAAA;AAC9B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9D;;IAGA,OAAO,GAAA;AACL,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;AAAE,YAAA,OAAO,KAAK;QAC3B,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;QAC7B,OAAO,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,KAAK,WAAW;IAC9E;IAEA,SAAS,GAAA;AACP,QAAA,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC;IAC3C;AAEA;;;AAGG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC5C,IAAI,KAAK,KAAK,CAAC;YAAE;AACjB,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAChE,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,IAAI,KAAK,WAAW;YAAE;;AAEhD,QAAA,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,GAAG,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC/D,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACrB;;IAGA,cAAc,GAAA;AACZ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;YAAE;QACtC,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC;AACrC,QAAA,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC;QACpE,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,EAAE,WAAW,GAAG,CAAC,CAAC;AAChD,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AACrD,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IACrB;;;IAKA,WAAW,GAAA;AACT,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;AAChC,QAAA,MAAM,IAAI,GAAG,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,CAAC,GAAG,IAAI;AAChE,QAAA,IAAI,CAAC,IAAI;YAAE;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG;AACpC,QAAA,MAAM,KAAK,GAAc;AACvB,YAAA,EAAE,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,GAAG,CAAC,CAAA,CAAE;YACtD,KAAK;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAc;SACpD;QACD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE,EAAE,KAAK,CAAC;AAC/C,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QAChC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,WAAW,CAAC,EAAU,EAAA;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;AACtE,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;AAC1B,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1B,YAAA,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;QAChC;AACA,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;AAEA,IAAA,YAAY,CAAC,KAAmB,EAAA;QAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;IACxC;AAEA,IAAA,SAAS,CAAC,KAAmB,EAAA;QAC3B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC1C;;;AAKiB,IAAA,QAAQ,GAAG,MAAM,CAEhC,IAAI,+EAAC;;AAEE,IAAA,UAAU,GAAG,MAAM,CAAgB,IAAI,iFAAC;IAEjD,cAAc,CAAC,KAAmB,EAAE,KAAgB,EAAA;AAClD,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC3C,KAAK,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC;QACrD,IAAI,KAAK,CAAC,YAAY;AAAE,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM;IACnE;IAEA,aAAa,CAAC,IAAc,EAAE,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACzC,QAAA,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,YAAY;AAAE,YAAA,KAAK,CAAC,YAAY,CAAC,aAAa,GAAG,MAAM;IACpE;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B;IAEA,SAAS,CAAC,MAAkB,EAAE,KAAiB,EAAA;AAC7C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;QACtB,KAAK,EAAE,cAAc,EAAE;QACvB,KAAK,EAAE,eAAe,EAAE;QACxB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrC;;IAGA,IAAI,CAAC,MAAkB,EAAE,KAAiB,EAAA;QACxC,KAAK,EAAE,cAAc,EAAE;QACvB,KAAK,EAAE,eAAe,EAAE;AACxB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,IAAI,CAAC,QAAQ;YAAE;QACf,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;AAEnF,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE;AAC7B,YAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;AAChD,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;AACjE,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;YACxB;QACF;AACA,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI;AAC1B,QAAA,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO;QAC9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;AACtD,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5D,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;IACvB;AAEA,IAAA,YAAY,CAAC,MAAkB,EAAA;QAC7B,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC;IAC7C;IAEA,UAAU,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI;IACjC;;AAIA,IAAA,MAAM,CAAC,IAAqB,EAAA;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEA,IAAA,cAAc,CAAC,IAAc,EAAA;AAC3B,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACtD;;IAIA,UAAU,GAAA;QACR,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC/D;AAEA,IAAA,QAAQ,CAAC,GAAW,EAAA;AAClB,QAAA,IAAI;YACF,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;AACvC,YAAA,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC;AAC/D,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACnB,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QACjE;IACF;;AAIA,IAAA,SAAS,CAAC,KAAoB,EAAA;AAC5B,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAqB;AAC1C,QAAA,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;YAAE;QAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE;AACnC,QAAA,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACnD,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QACb;aAAO,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,QAAQ,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE;YAC7F,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,IAAI,EAAE;QACb;aAAO,IAAI,KAAK,CAAC,OAAO,IAAI,GAAG,KAAK,GAAG,EAAE;YACvC,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,iBAAiB,EAAE;QAC1B;AAAO,aAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;YAC3B,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;QACvB;AAAO,aAAA,IAAI,GAAG,KAAK,QAAQ,EAAE;YAC3B,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACnB;aAAO,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,KAAK,SAAS,EAAE;YAC5C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvB;aAAO,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,KAAK,WAAW,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACtB;aAAO,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,KAAK,YAAY,EAAE;YAC/C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,YAAY,EAAE;QACrB;aAAO,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG,KAAK,WAAW,EAAE;YAC9C,KAAK,CAAC,cAAc,EAAE;YACtB,IAAI,CAAC,cAAc,EAAE;QACvB;IACF;wGAzgBW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhStB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8RT,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,03UAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EArSC,qBAAqB,sOACrB,kBAAkB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,qBAAqB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,QAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,eAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAErB,gBAAgB,+IADhB,QAAQ,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,IAAA,EAAA,CAAA;;4FAoSC,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA5SjC,SAAS;+BACE,gBAAgB,EAAA,eAAA,EACT,uBAAuB,CAAC,MAAM,iBAChC,iBAAiB,CAAC,IAAI,EAAA,OAAA,EAC5B;wBACP,qBAAqB;wBACrB,kBAAkB;wBAClB,qBAAqB;wBACrB,QAAQ;wBACR,gBAAgB;qBACjB,EAAA,QAAA,EAES;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8RT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,03UAAA,CAAA,EAAA;;;ACnYH;;;;;;AAMG;;ACNH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mosaicoo/form-angular",
3
- "version": "0.9.1",
3
+ "version": "0.9.3",
4
4
  "description": "Angular renderer for Mosaicoo Form: accessible, token-themable dynamic forms with wizard mode and host-provided dynamic options",
5
5
  "license": "MIT",
6
6
  "author": "Mosaicoo",
@@ -39,7 +39,7 @@
39
39
  }
40
40
  },
41
41
  "dependencies": {
42
- "@mosaicoo/form-core": "^0.9.1",
42
+ "@mosaicoo/form-core": "^0.9.3",
43
43
  "tslib": "^2.3.0"
44
44
  },
45
45
  "sideEffects": false,