geonodes-web-render 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/embed.css CHANGED
@@ -1,2 +1,2 @@
1
- .react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}.app-layout{grid-template-columns:var(--left-w,28%) 6px minmax(0, 1fr) 6px var(--right-w,26%);gap:0;width:100%;height:100vh;min-height:100svh;display:grid}.left-pane,.center-pane,.right-pane{min-width:0;min-height:0}.pane-divider{cursor:col-resize;touch-action:none;position:relative}.pane-divider:after{content:"";background:var(--border);width:1px;margin:0 auto;transition:width .1s,background .1s;position:absolute;inset:0}.pane-divider:hover:after,body.is-resizing .pane-divider:after{background:var(--accent);width:3px}body.is-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}body.is-resizing .left-pane,body.is-resizing .center-pane,body.is-resizing .right-pane{pointer-events:none}.panel-body .cm-content{padding:10px 14px 24px}.right-pane .cm-content,.right-pane .cm-gutters{font-size:15px}.flow-panel__body .react-flow__node.selected:not(:has(.gn-reroute)){outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}.flow-panel__body .react-flow__node.selected .gn-reroute{box-shadow:0 0 0 1px #00000059, 0 0 0 3px var(--bg), 0 0 0 5px var(--accent)}.flow-panel__body .react-flow__selection{border:1px solid var(--accent);background:var(--accent-bg)}.panel{flex-direction:column;height:100%;min-height:0;display:flex}.panel-header{border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:10px 12px;display:flex}.panel-title{color:var(--text-h);font-weight:600}.panel-status{opacity:.8;margin-left:auto;font-size:13px}.panel-body{flex:auto;min-height:0;display:flex;overflow:hidden}.panel-footer{border-top:1px solid var(--border);padding:8px 12px;font-size:13px}.tabs{flex-wrap:wrap;gap:6px;display:inline-flex}.tab{appearance:none;border:1px solid var(--border);color:var(--text-h);cursor:pointer;background:0 0;border-radius:8px;padding:6px 10px;font-size:14px}.tab.active{border-color:var(--accent-border);background:var(--accent-bg)}.tab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel-actions{gap:8px;display:inline-flex}.view-toggle{border:1px solid var(--border);border-radius:8px;display:inline-flex;overflow:hidden}.view-toggle__option{appearance:none;color:var(--text);cursor:pointer;background:0 0;border:none;padding:6px 10px;font-size:13px}.view-toggle__option+.view-toggle__option{border-left:1px solid var(--border)}.view-toggle__option.active{background:var(--accent-bg);color:var(--text-h)}.view-toggle__option:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.action-button{appearance:none;border:1px solid var(--border);color:var(--text-h);cursor:pointer;background:0 0;border-radius:8px;padding:6px 10px;font-size:14px}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.cm-editor{width:100%;height:100%}.cm-editor .cm-content{font-family:var(--mono);font-size:12px;line-height:150%}.cm-editor .cm-gutters{font-size:11px}.json-status.ok{color:var(--text)}.json-status.bad{color:#ef4444}.flow-panel .panel-header{justify-content:space-between}.flow-panel__body{background:radial-gradient(1200px 600px at 20% 10%, #aa3bff14, transparent 60%), var(--bg);position:relative}.flow-empty{flex:auto;place-items:center;font-size:14px;display:grid}.flow-error{color:#f87171;text-align:center;flex-direction:column;flex:auto;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:13px;display:flex}.flow-error strong{font-size:14px;font-weight:600}.flow-error span{opacity:.8;word-break:break-word;max-width:480px;font-family:monospace}.flow-panel__body .react-flow{--xy-background-color-default:transparent;--xy-controls-button-background-color-default:var(--bg);--xy-controls-button-color-default:var(--text-h);--xy-controls-button-border-color-default:var(--border);--xy-edge-stroke-width-default:2.5;width:100%;height:100%}.flow-panel__body .react-flow__attribution{display:none}.flow-panel__body .react-flow__pane{cursor:grab}.flow-panel__body .react-flow__pane:active{cursor:grabbing}.flow-panel__body .react-flow__node,.flow-panel__body .react-flow__edge{pointer-events:none}.gn-reroute{box-sizing:border-box;background:var(--gn-reroute-color,#888);pointer-events:none;border:2px solid #00000059;border-radius:50%;width:12px;height:12px;box-shadow:0 0 0 1px #ffffff1f}.gn-reroute .gn-reroute__handle{opacity:0;pointer-events:none;cursor:default;background:0 0!important;border:none!important;width:1px!important;min-width:0!important;height:1px!important;min-height:0!important}.gn-reroute .react-flow__handle-left.gn-reroute__handle{top:50%;left:0;transform:translate(-50%,-50%)}.gn-reroute .react-flow__handle-right.gn-reroute__handle{top:50%;right:0;transform:translate(50%,-50%)}.gn-node{box-sizing:border-box;border:1px solid var(--border);background:color-mix(in srgb, var(--bg) 88%, #111827 12%);color:var(--text-h);box-shadow:var(--shadow);border-radius:8px;overflow:visible}.gn-node__header{box-sizing:border-box;border-bottom:1px solid #0000004d;border-top-left-radius:7px;border-top-right-radius:7px;align-items:center;min-height:28px;padding:6px 10px;display:flex}.gn-node__title{color:#ffffffd9;font-size:12px;font-weight:600;line-height:1.2}.gn-node__props{background:color-mix(in srgb, var(--bg) 80%, #000 20%);border-bottom:1px solid #00000040;padding:4px 10px}.gn-node__prop-row{color:var(--text);white-space:nowrap;text-overflow:ellipsis;background:color-mix(in srgb, var(--bg) 60%, #000 40%);border:1px solid #ffffff14;border-radius:3px;margin:2px 0;padding:1px 6px;font-size:10px;line-height:1.8;overflow:hidden}.gn-node--group{pointer-events:all;cursor:pointer;border-color:var(--accent-border);box-shadow:0 0 0 1px var(--accent-border), 0 0 16px 3px color-mix(in srgb, var(--accent) 25%, transparent), var(--shadow);transition:box-shadow .15s,border-color .15s;position:relative}.gn-node--group:hover{border-color:var(--accent);box-shadow:0 0 0 1.5px var(--accent), 0 0 24px 6px color-mix(in srgb, var(--accent) 40%, transparent), var(--shadow)}.gn-node__stack{z-index:-1;flex-direction:column;align-items:center;gap:1px;display:flex;position:absolute;top:calc(100% - 2px);left:0;right:0}.gn-node__stack-bar{background:color-mix(in srgb, var(--text) 22%, var(--bg));border:1px solid color-mix(in srgb, var(--text) 45%, var(--bg));border-top:none;border-radius:0 0 5px 5px;height:4px;box-shadow:0 1px 2px #00000026}.gn-node__stack-bar:first-child{opacity:1;width:90%}.gn-node__stack-bar:nth-child(2){opacity:.7;width:78%}.gn-node__stack-bar:nth-child(3){opacity:.45;width:66%}.gn-node__body{background:color-mix(in srgb, var(--bg) 90%, #111827 10%);border-bottom-right-radius:7px;border-bottom-left-radius:7px;padding:6px 0}.gn-node__socket-row{align-items:center;min-height:20px;padding:0 10px;display:flex;position:relative}.gn-node__socket-row--right{justify-content:flex-end}.gn-node__socket-row--right .gn-node__socket-label{text-align:right}.gn-node__socket-label{color:var(--text-h);white-space:nowrap;text-overflow:ellipsis;flex:1 1 0;min-width:0;font-size:10px;line-height:1.2;overflow:hidden}.gn-node__value{color:var(--text);white-space:nowrap;text-align:right;flex-shrink:0;margin-left:8px;font-size:10px;line-height:1.2}.gn-node__color-swatch{border:1px solid var(--border);border-radius:3px;height:14px;margin:2px 8px 4px 18px}.gn-node__curve-wrap{border-bottom:1px solid var(--border);background:#1e1e1e;padding:6px 6px 4px}.gn-node__curve-svg{display:block}.gn-node__curve-zero{stroke:#ffffff26;stroke-width:1px;fill:none;stroke-dasharray:3 3}.gn-node__curve-fill{fill:#ffffff14}.gn-node__curve-stroke{fill:none;stroke:#ffffffbf;stroke-width:1.5px;stroke-linejoin:round;stroke-linecap:round}.gn-node__curve-dot{fill:#ccc;stroke:#1e1e1e;stroke-width:1px}.gn-node__vec-block{border:1px solid var(--border);border-radius:4px;margin:1px 8px 4px 18px;overflow:hidden}.gn-node__vec-row{background:color-mix(in srgb, var(--bg) 70%, #111827 30%);border-top:1px solid var(--border);justify-content:space-between;align-items:center;height:16px;padding:0 6px;display:flex}.gn-node__vec-row:first-child{border-top:none}.gn-node__vec-label{color:var(--text);text-transform:uppercase;flex-shrink:0;width:10px;font-size:9px}.gn-node__vec-value{color:var(--text-h);text-align:right;font-size:9px}.gn-node .react-flow__handle.gn-socket{pointer-events:none;cursor:default;background:0 0;border:1px solid #0000;margin-top:0;top:50%}.gn-node .react-flow__handle.gn-socket--circle{border-radius:999px;width:8px;height:8px}.gn-node .react-flow__handle.gn-socket--line{border-radius:1px;width:7px;height:12px}.gn-node .react-flow__handle.gn-socket--diamond{border-radius:1px;width:8px;height:8px}.gn-node .react-flow__handle.gn-socket--list,.gn-node .react-flow__handle.gn-socket--grid{border-radius:2px;width:9px;height:9px}.gn-node .react-flow__handle-left.gn-socket{left:0;transform:translate(-50%,-50%)}.gn-node .react-flow__handle-right.gn-socket{right:0;transform:translate(50%,-50%)}.gn-node .react-flow__handle-left.gn-socket--diamond{transform:translate(-50%,-50%)rotate(45deg)}.gn-node .react-flow__handle-right.gn-socket--diamond{transform:translate(50%,-50%)rotate(45deg)}.flow-panel__body .react-flow__edge-path{stroke-width:2.5px}.flow-panel__body .react-flow__edge.selected .react-flow__edge-path,.flow-panel__body .react-flow__edge-path{stroke-linecap:round;stroke-linejoin:round}@media (width<=980px){.app-layout{grid-template-rows:40svh 1fr 30svh;grid-template-columns:1fr}.pane-divider{display:none}.left-pane{border-bottom:1px solid var(--border)}.right-pane{border-top:1px solid var(--border)}}.geonodes-embed{background:var(--bg,#1a1a1a);flex-direction:column;height:100%;min-height:0;display:flex}.geonodes-embed--dark{--text:#9ca3af;--text-h:#f3f4f6;--bg:#16171d;--border:#2e303a;--code-bg:#1f2028;--accent:#c084fc;--accent-bg:#c084fc26;--accent-border:#c084fc80;color:var(--text);background:var(--bg)}.geonodes-embed__header{border-bottom:1px solid var(--border,#333);flex-shrink:0;align-items:center;padding:6px 10px;display:flex}.geonodes-embed__title{color:var(--text-h,#eee);font-weight:600}.geonodes-embed__body{flex:auto;min-height:0;position:relative;overflow:hidden}.gn-version-badge{background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);color:var(--text);opacity:.6;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:6px;padding:3px 8px;font-size:11px;display:inline-block}.gnwr-copy-button{z-index:10;appearance:none;background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);color:var(--text);cursor:pointer;opacity:.85;border-radius:6px;padding:6px 12px;font-size:12px;transition:opacity .15s,border-color .15s,color .15s;position:absolute;top:44px;right:10px}.gnwr-copy-button:hover{opacity:1;border-color:var(--accent-border);color:var(--accent)}.gnwr-copy-button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.gnwr-copy-toast{z-index:10;background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--accent-border);max-width:260px;color:var(--text);border-radius:6px;padding:8px 12px;font-size:12px;line-height:1.4;animation:.15s ease-out gnwr-copy-toast-in;position:absolute;top:82px;right:10px;box-shadow:0 4px 14px #00000059}.gnwr-copy-toast__link{color:var(--accent);text-decoration:underline}.gnwr-copy-toast__link:hover{text-decoration:none}@keyframes gnwr-copy-toast-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.gn-breadcrumbs{background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);pointer-events:all;border-radius:6px;flex-wrap:wrap;align-items:center;gap:2px;padding:4px 8px;font-size:12px;display:flex}.gn-breadcrumbs__item{align-items:center;gap:2px;display:inline-flex}.gn-breadcrumbs__sep{color:var(--text);opacity:.6;padding:0 2px}.gn-breadcrumbs__link{appearance:none;color:var(--text);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:2px 4px;font-size:12px}.gn-breadcrumbs__link:hover{color:var(--accent);background:var(--accent-bg)}.gn-breadcrumbs__current{color:var(--text-h);padding:2px 4px;font-weight:600}
1
+ .react-flow{--xy-edge-stroke-default:#b1b1b7;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#555;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#ffffff80;--xy-minimap-background-color-default:#fff;--xy-minimap-mask-background-color-default:#f0f0f099;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#e2e2e2;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:transparent;--xy-background-pattern-dots-color-default:#91919a;--xy-background-pattern-lines-color-default:#eee;--xy-background-pattern-cross-color-default:#e2e2e2;background-color:var(--xy-background-color,var(--xy-background-color-default));--xy-node-color-default:inherit;--xy-node-border-default:1px solid #1a192b;--xy-node-background-color-default:#fff;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #00000014;--xy-node-boxshadow-selected-default:0 0 0 .5px #1a192b;--xy-node-border-radius-default:3px;--xy-handle-background-color-default:#1a192b;--xy-handle-border-color-default:#fff;--xy-selection-background-color-default:#0059dc14;--xy-selection-border-default:1px dotted #0059dccc;--xy-controls-button-background-color-default:#fefefe;--xy-controls-button-background-color-hover-default:#f4f4f4;--xy-controls-button-color-default:inherit;--xy-controls-button-color-hover-default:inherit;--xy-controls-button-border-color-default:#eee;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#fff;--xy-edge-label-color-default:inherit;--xy-resize-background-color-default:#3367d9;direction:ltr}.react-flow.dark{--xy-edge-stroke-default:#3e3e3e;--xy-edge-stroke-width-default:1;--xy-edge-stroke-selected-default:#727272;--xy-connectionline-stroke-default:#b1b1b7;--xy-connectionline-stroke-width-default:1;--xy-attribution-background-color-default:#96969640;--xy-minimap-background-color-default:#141414;--xy-minimap-mask-background-color-default:#3c3c3c99;--xy-minimap-mask-stroke-color-default:transparent;--xy-minimap-mask-stroke-width-default:1;--xy-minimap-node-background-color-default:#2b2b2b;--xy-minimap-node-stroke-color-default:transparent;--xy-minimap-node-stroke-width-default:2;--xy-background-color-default:#141414;--xy-background-pattern-dots-color-default:#777;--xy-background-pattern-lines-color-default:#777;--xy-background-pattern-cross-color-default:#777;--xy-node-color-default:#f8f8f8;--xy-node-border-default:1px solid #3c3c3c;--xy-node-background-color-default:#1e1e1e;--xy-node-group-background-color-default:#f0f0f040;--xy-node-boxshadow-hover-default:0 1px 4px 1px #ffffff14;--xy-node-boxshadow-selected-default:0 0 0 .5px #999;--xy-handle-background-color-default:#bebebe;--xy-handle-border-color-default:#1e1e1e;--xy-selection-background-color-default:#c8c8dc14;--xy-selection-border-default:1px dotted #c8c8dccc;--xy-controls-button-background-color-default:#2b2b2b;--xy-controls-button-background-color-hover-default:#3e3e3e;--xy-controls-button-color-default:#f8f8f8;--xy-controls-button-color-hover-default:#fff;--xy-controls-button-border-color-default:#5b5b5b;--xy-controls-box-shadow-default:0 0 2px 1px #00000014;--xy-edge-label-background-color-default:#141414;--xy-edge-label-color-default:#f8f8f8}.react-flow__background{background-color:var(--xy-background-color-props,var(--xy-background-color,var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__pane{z-index:1;touch-action:none}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width,var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke,var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width,var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{pointer-events:none;position:absolute;overflow:visible}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:.5s linear infinite dashdraw}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected,var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;user-select:none}.react-flow__arrowhead polyline{stroke:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__arrowhead polyline.arrowclosed{fill:var(--xy-edge-stroke,var(--xy-edge-stroke-default))}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:.5s linear infinite dashdraw}svg.react-flow__connectionline{z-index:1001;position:absolute;overflow:visible}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{-webkit-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default;position:absolute}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:0 0;pointer-events:none}.react-flow__nodesselection-rect{pointer-events:all;cursor:grab;position:absolute}.react-flow__handle{pointer-events:none;background-color:var(--xy-handle-background-color,var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color,var(--xy-handle-border-color-default));border-radius:100%;width:6px;min-width:5px;height:6px;min-height:5px;position:absolute}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;bottom:0;left:50%;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__pane.selection .react-flow__panel{pointer-events:none}.react-flow__panel{z-index:5;margin:15px;position:absolute}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.top.center,.react-flow__panel.bottom.center{left:50%;transform:translate(-15px)translate(-50%)}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.left.center,.react-flow__panel.right.center{top:50%;transform:translateY(-15px)translateY(-50%)}.react-flow__attribution{background:var(--xy-attribution-background-color,var(--xy-attribution-background-color-default));margin:0;padding:2px 3px;font-size:10px}.react-flow__attribution a{color:#999;text-decoration:none}@keyframes dashdraw{0%{stroke-dashoffset:10px}}.react-flow__edgelabel-renderer{pointer-events:none;-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__viewport-portal{-webkit-user-select:none;user-select:none;width:100%;height:100%;position:absolute;top:0;left:0}.react-flow__minimap{background:var(--xy-minimap-background-color-props,var(--xy-minimap-background-color,var(--xy-minimap-background-color-default)))}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var(--xy-minimap-mask-background-color-props,var(--xy-minimap-mask-background-color,var(--xy-minimap-mask-background-color-default)));stroke:var(--xy-minimap-mask-stroke-color-props,var(--xy-minimap-mask-stroke-color,var(--xy-minimap-mask-stroke-color-default)));stroke-width:var(--xy-minimap-mask-stroke-width-props,var(--xy-minimap-mask-stroke-width,var(--xy-minimap-mask-stroke-width-default)))}.react-flow__minimap-node{fill:var(--xy-minimap-node-background-color-props,var(--xy-minimap-node-background-color,var(--xy-minimap-node-background-color-default)));stroke:var(--xy-minimap-node-stroke-color-props,var(--xy-minimap-node-stroke-color,var(--xy-minimap-node-stroke-color-default)));stroke-width:var(--xy-minimap-node-stroke-width-props,var(--xy-minimap-node-stroke-width,var(--xy-minimap-node-stroke-width-default)))}.react-flow__background-pattern.dots{fill:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-dots-color-default)))}.react-flow__background-pattern.lines{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-lines-color-default)))}.react-flow__background-pattern.cross{stroke:var(--xy-background-pattern-color-props,var(--xy-background-pattern-color,var(--xy-background-pattern-cross-color-default)))}.react-flow__controls{box-shadow:var(--xy-controls-box-shadow,var(--xy-controls-box-shadow-default));flex-direction:column;display:flex}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{background:var(--xy-controls-button-background-color,var(--xy-controls-button-background-color-default));border:none;border-bottom:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)));width:26px;height:26px;color:var(--xy-controls-button-color-props,var(--xy-controls-button-color,var(--xy-controls-button-color-default)));cursor:pointer;-webkit-user-select:none;user-select:none;justify-content:center;align-items:center;padding:4px;display:flex}.react-flow__controls-button svg{fill:currentColor;width:100%;max-width:12px;max-height:12px}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{border-radius:var(--xy-node-border-radius,var(--xy-node-border-radius-default));width:150px;color:var(--xy-node-color,var(--xy-node-color-default));text-align:center;border:var(--xy-node-border,var(--xy-node-border-default));background-color:var(--xy-node-background-color,var(--xy-node-background-color-default));padding:10px;font-size:12px}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover,var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected,var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color,var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color,var(--xy-selection-background-color-default));border:var(--xy-selection-border,var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var(--xy-controls-button-background-color-hover-props,var(--xy-controls-button-background-color-hover,var(--xy-controls-button-background-color-hover-default)));color:var(--xy-controls-button-color-hover-props,var(--xy-controls-button-color-hover,var(--xy-controls-button-color-hover-default)))}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__controls.horizontal .react-flow__controls-button{border-bottom:none;border-right:1px solid var(--xy-controls-button-border-color-props,var(--xy-controls-button-border-color,var(--xy-controls-button-border-color-default)))}.react-flow__controls.horizontal .react-flow__controls-button:last-child{border-right:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{background-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border:1px solid #fff;border-radius:1px;width:5px;height:5px;translate:-50% -50%}.react-flow__resize-control.handle.left{top:50%;left:0}.react-flow__resize-control.handle.right{top:50%;left:100%}.react-flow__resize-control.handle.top{top:0;left:50%}.react-flow__resize-control.handle.bottom{top:100%;left:50%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color,var(--xy-resize-background-color-default));border-style:solid;border-width:0}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;height:100%;top:0;transform:translate(-50%)}.react-flow__resize-control.line.left{border-left-width:1px;left:0}.react-flow__resize-control.line.right{border-right-width:1px;left:100%}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{width:100%;height:1px;left:0;transform:translateY(-50%)}.react-flow__resize-control.line.top{border-top-width:1px;top:0}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color,var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color,var(--xy-edge-label-color-default))}.app-layout{grid-template-columns:var(--left-w,28%) 6px minmax(0, 1fr) 6px var(--right-w,26%);gap:0;width:100%;height:100vh;min-height:100svh;display:grid}.left-pane,.center-pane,.right-pane{min-width:0;min-height:0}.pane-divider{cursor:col-resize;touch-action:none;position:relative}.pane-divider:after{content:"";background:var(--border);width:1px;margin:0 auto;transition:width .1s,background .1s;position:absolute;inset:0}.pane-divider:hover:after,body.is-resizing .pane-divider:after{background:var(--accent);width:3px}body.is-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}body.is-resizing .left-pane,body.is-resizing .center-pane,body.is-resizing .right-pane{pointer-events:none}.panel-body .cm-content{padding:10px 14px 24px}.right-pane .cm-content,.right-pane .cm-gutters{font-size:15px}.flow-panel__body .react-flow__node.selected:not(:has(.gn-reroute)){outline:2px solid var(--accent);outline-offset:2px;border-radius:6px}.flow-panel__body .react-flow__node.selected .gn-reroute{box-shadow:0 0 0 1px #00000059, 0 0 0 3px var(--bg), 0 0 0 5px var(--accent)}.flow-panel__body .react-flow__selection,.flow-panel__body .react-flow__nodesselection-rect{border:1px solid var(--accent);background:var(--accent-bg)}.flow-panel__body .react-flow__nodesselection-rect{box-sizing:content-box;border-radius:10px;margin:-16px;padding:16px}.panel{flex-direction:column;height:100%;min-height:0;display:flex}.panel-header{border-bottom:1px solid var(--border);align-items:center;gap:12px;padding:10px 12px;display:flex}.panel-title{color:var(--text-h);font-weight:600}.panel-status{opacity:.8;margin-left:auto;font-size:13px}.panel-body{flex:auto;min-height:0;display:flex;overflow:hidden}.panel-footer{border-top:1px solid var(--border);padding:8px 12px;font-size:13px}.tabs{flex-wrap:wrap;gap:6px;display:inline-flex}.tab{appearance:none;border:1px solid var(--border);color:var(--text-h);cursor:pointer;background:0 0;border-radius:8px;padding:6px 10px;font-size:14px}.tab.active{border-color:var(--accent-border);background:var(--accent-bg)}.tab:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.panel-actions{gap:8px;display:inline-flex}.view-toggle{border:1px solid var(--border);border-radius:8px;display:inline-flex;overflow:hidden}.view-toggle__option{appearance:none;color:var(--text);cursor:pointer;background:0 0;border:none;padding:6px 10px;font-size:13px}.view-toggle__option+.view-toggle__option{border-left:1px solid var(--border)}.view-toggle__option.active{background:var(--accent-bg);color:var(--text-h)}.view-toggle__option:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.action-button{appearance:none;border:1px solid var(--border);color:var(--text-h);cursor:pointer;background:0 0;border-radius:8px;padding:6px 10px;font-size:14px}.action-button:disabled{opacity:.5;cursor:not-allowed}.action-button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.cm-editor{width:100%;height:100%}.cm-editor .cm-content{font-family:var(--mono);font-size:12px;line-height:150%}.cm-editor .cm-gutters{font-size:11px}.json-status.ok{color:var(--text)}.json-status.bad{color:#ef4444}.flow-panel .panel-header{justify-content:space-between}.flow-panel__body{background:radial-gradient(1200px 600px at 20% 10%, #aa3bff14, transparent 60%), var(--bg);position:relative}.flow-empty{flex:auto;place-items:center;font-size:14px;display:grid}.gnwr-loading{background:var(--bg);color:var(--text);flex-direction:column;justify-content:center;align-items:center;gap:14px;display:flex;position:absolute;inset:0}.gnwr-loading__spinner{border:3px solid var(--accent-bg);border-top-color:var(--accent);border-radius:50%;width:34px;height:34px;animation:.7s linear infinite gnwr-spin}.gnwr-loading__label{letter-spacing:.02em;opacity:.85;font-size:13px}@keyframes gnwr-spin{to{transform:rotate(360deg)}}.flow-error{color:#f87171;text-align:center;flex-direction:column;flex:auto;justify-content:center;align-items:center;gap:8px;padding:24px;font-size:13px;display:flex}.flow-error strong{font-size:14px;font-weight:600}.flow-error span{opacity:.8;word-break:break-word;max-width:480px;font-family:monospace}.flow-panel__body .react-flow{--xy-background-color-default:transparent;--xy-controls-button-background-color-default:var(--bg);--xy-controls-button-color-default:var(--text-h);--xy-controls-button-border-color-default:var(--border);--xy-edge-stroke-width-default:2.5;width:100%;height:100%}.flow-panel__body .react-flow__attribution{display:none}.flow-panel__body .react-flow__pane{cursor:grab}.flow-panel__body .react-flow__pane:active{cursor:grabbing}.flow-panel__body .react-flow__node,.flow-panel__body .react-flow__edge{pointer-events:none}.gn-reroute{box-sizing:border-box;background:var(--gn-reroute-color,#888);pointer-events:none;border:2px solid #00000059;border-radius:50%;width:12px;height:12px;box-shadow:0 0 0 1px #ffffff1f}.gn-reroute .gn-reroute__handle{opacity:0;pointer-events:none;cursor:default;background:0 0!important;border:none!important;width:1px!important;min-width:0!important;height:1px!important;min-height:0!important}.gn-reroute .react-flow__handle-left.gn-reroute__handle{top:50%;left:0;transform:translate(-50%,-50%)}.gn-reroute .react-flow__handle-right.gn-reroute__handle{top:50%;right:0;transform:translate(50%,-50%)}.gn-node{box-sizing:border-box;border:1px solid var(--border);background:color-mix(in srgb, var(--bg) 88%, #111827 12%);color:var(--text-h);box-shadow:var(--shadow);border-radius:8px;overflow:visible}.gn-node__header{box-sizing:border-box;border-bottom:1px solid #0000004d;border-top-left-radius:7px;border-top-right-radius:7px;align-items:center;min-height:28px;padding:6px 10px;display:flex}.gn-node__title{color:#ffffffd9;font-size:12px;font-weight:600;line-height:1.2}.gn-node__props{background:color-mix(in srgb, var(--bg) 80%, #000 20%);border-bottom:1px solid #00000040;padding:4px 10px}.gn-node__prop-row{color:var(--text);white-space:nowrap;text-overflow:ellipsis;background:color-mix(in srgb, var(--bg) 60%, #000 40%);border:1px solid #ffffff14;border-radius:3px;margin:2px 0;padding:1px 6px;font-size:10px;line-height:1.8;overflow:hidden}.gn-node--group{pointer-events:all;cursor:pointer;border-color:var(--accent-border);box-shadow:0 0 0 1px var(--accent-border), 0 0 16px 3px color-mix(in srgb, var(--accent) 25%, transparent), var(--shadow);transition:box-shadow .15s,border-color .15s;position:relative}.gn-node--group:hover{border-color:var(--accent);box-shadow:0 0 0 1.5px var(--accent), 0 0 24px 6px color-mix(in srgb, var(--accent) 40%, transparent), var(--shadow)}.gn-node__stack{z-index:-1;flex-direction:column;align-items:center;gap:1px;display:flex;position:absolute;top:calc(100% - 2px);left:0;right:0}.gn-node__stack-bar{background:color-mix(in srgb, var(--text) 22%, var(--bg));border:1px solid color-mix(in srgb, var(--text) 45%, var(--bg));border-top:none;border-radius:0 0 5px 5px;height:4px;box-shadow:0 1px 2px #00000026}.gn-node__stack-bar:first-child{opacity:1;width:90%}.gn-node__stack-bar:nth-child(2){opacity:.7;width:78%}.gn-node__stack-bar:nth-child(3){opacity:.45;width:66%}.gn-node__body{background:color-mix(in srgb, var(--bg) 90%, #111827 10%);border-bottom-right-radius:7px;border-bottom-left-radius:7px;padding:6px 0}.gn-node__socket-row{align-items:center;min-height:20px;padding:0 10px;display:flex;position:relative}.gn-node__socket-row--right{justify-content:flex-end}.gn-node__socket-row--right .gn-node__socket-label{text-align:right}.gn-node__socket-label{color:var(--text-h);white-space:nowrap;text-overflow:ellipsis;flex:1 1 0;min-width:0;font-size:10px;line-height:1.2;overflow:hidden}.gn-node__value{color:var(--text);white-space:nowrap;text-align:right;flex-shrink:0;margin-left:8px;font-size:10px;line-height:1.2}.gn-node__color-swatch{border:1px solid var(--border);border-radius:3px;height:14px;margin:2px 8px 4px 18px}.gn-node__curve-wrap{border-bottom:1px solid var(--border);background:#1e1e1e;padding:6px 6px 4px}.gn-node__curve-svg{display:block}.gn-node__curve-zero{stroke:#ffffff26;stroke-width:1px;fill:none;stroke-dasharray:3 3}.gn-node__curve-fill{fill:#ffffff14}.gn-node__curve-stroke{fill:none;stroke:#ffffffbf;stroke-width:1.5px;stroke-linejoin:round;stroke-linecap:round}.gn-node__curve-dot{fill:#ccc;stroke:#1e1e1e;stroke-width:1px}.gn-node__vec-block{border:1px solid var(--border);border-radius:4px;margin:1px 8px 4px 18px;overflow:hidden}.gn-node__vec-row{background:color-mix(in srgb, var(--bg) 70%, #111827 30%);border-top:1px solid var(--border);justify-content:space-between;align-items:center;height:16px;padding:0 6px;display:flex}.gn-node__vec-row:first-child{border-top:none}.gn-node__vec-label{color:var(--text);text-transform:uppercase;flex-shrink:0;width:10px;font-size:9px}.gn-node__vec-value{color:var(--text-h);text-align:right;font-size:9px}.gn-node .react-flow__handle.gn-socket{pointer-events:none;cursor:default;background:0 0;border:1px solid #0000;margin-top:0;top:50%}.gn-node .react-flow__handle.gn-socket--circle{border-radius:999px;width:8px;height:8px}.gn-node .react-flow__handle.gn-socket--line{border-radius:1px;width:7px;height:12px}.gn-node .react-flow__handle.gn-socket--diamond{border-radius:1px;width:8px;height:8px}.gn-node .react-flow__handle.gn-socket--list,.gn-node .react-flow__handle.gn-socket--grid{border-radius:2px;width:9px;height:9px}.gn-node .react-flow__handle-left.gn-socket{left:0;transform:translate(-50%,-50%)}.gn-node .react-flow__handle-right.gn-socket{right:0;transform:translate(50%,-50%)}.gn-node .react-flow__handle-left.gn-socket--diamond{transform:translate(-50%,-50%)rotate(45deg)}.gn-node .react-flow__handle-right.gn-socket--diamond{transform:translate(50%,-50%)rotate(45deg)}.flow-panel__body .react-flow__edge-path{stroke-width:2.5px}.flow-panel__body .react-flow__edge.selected .react-flow__edge-path,.flow-panel__body .react-flow__edge-path{stroke-linecap:round;stroke-linejoin:round}@media (width<=980px){.app-layout{grid-template-rows:40svh 1fr 30svh;grid-template-columns:1fr}.pane-divider{display:none}.left-pane{border-bottom:1px solid var(--border)}.right-pane{border-top:1px solid var(--border)}}.geonodes-embed{background:var(--bg,#1a1a1a);flex-direction:column;height:100%;min-height:0;display:flex}.geonodes-embed--dark{--text:#9ca3af;--text-h:#f3f4f6;--bg:#16171d;--border:#2e303a;--code-bg:#1f2028;--accent:#c084fc;--accent-bg:#c084fc26;--accent-border:#c084fc80;color:var(--text);background:var(--bg)}.geonodes-embed__header{border-bottom:1px solid var(--border,#333);flex-shrink:0;align-items:center;padding:6px 10px;display:flex}.geonodes-embed__title{color:var(--text-h,#eee);font-weight:600}.geonodes-embed__body{flex:auto;min-height:0;position:relative;overflow:hidden}.gn-top-left{flex-direction:column;align-items:flex-start;gap:6px;display:flex}.gn-version-badge{background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);color:var(--text);opacity:.6;pointer-events:none;-webkit-user-select:none;user-select:none;white-space:nowrap;border-radius:6px;padding:3px 8px;font-size:11px;display:inline-block}.gnwr-copy-button{z-index:10;appearance:none;background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);color:var(--text);cursor:pointer;opacity:.85;border-radius:6px;align-items:center;gap:7px;padding:5px 12px 5px 8px;font-size:12px;transition:opacity .15s,border-color .15s,color .15s;display:inline-flex;position:absolute;top:10px;right:10px}.gnwr-copy-button__logo{border-radius:4px;flex:none;width:18px;height:18px;box-shadow:0 1px 2px #0000004d}.gnwr-copy-button:hover{opacity:1;border-color:var(--accent-border);color:var(--accent)}.gnwr-copy-button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.gnwr-copy-toast{z-index:10;background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--accent-border);max-width:260px;color:var(--text);border-radius:6px;padding:8px 12px;font-size:12px;line-height:1.4;animation:.15s ease-out gnwr-copy-toast-in;position:absolute;top:48px;right:10px;box-shadow:0 4px 14px #00000059}.gnwr-copy-toast__link{color:var(--accent);text-decoration:underline}.gnwr-copy-toast__link:hover{text-decoration:none}@keyframes gnwr-copy-toast-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.gn-context-menu{z-index:1000;background:color-mix(in srgb, var(--bg) 88%, #000 12%);border:1px solid var(--border);border-radius:8px;min-width:200px;padding:4px;animation:.1s ease-out gnwr-copy-toast-in;position:fixed;box-shadow:0 8px 24px #00000073}.gn-context-menu__item{width:100%;color:var(--text);text-align:left;white-space:nowrap;cursor:pointer;background:0 0;border:none;border-radius:5px;padding:8px 10px;font-size:13px;display:block}.gn-context-menu__item:hover,.gn-context-menu__item:focus-visible{background:var(--accent);color:#fff;outline:none}.gn-context-toast{z-index:20;background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--accent-border);color:var(--text);border-radius:6px;padding:8px 14px;font-size:12px;animation:.15s ease-out gnwr-copy-toast-in;position:absolute;bottom:12px;left:50%;transform:translate(-50%);box-shadow:0 4px 14px #00000059}.gn-breadcrumbs{background:color-mix(in srgb, var(--bg) 85%, #000 15%);border:1px solid var(--border);pointer-events:all;border-radius:6px;flex-wrap:wrap;align-items:center;gap:2px;padding:4px 8px;font-size:12px;display:flex}.gn-breadcrumbs__item{align-items:center;gap:2px;display:inline-flex}.gn-breadcrumbs__sep{color:var(--text);opacity:.6;padding:0 2px}.gn-breadcrumbs__link{appearance:none;color:var(--text);cursor:pointer;background:0 0;border:none;border-radius:4px;padding:2px 4px;font-size:12px}.gn-breadcrumbs__link:hover{color:var(--accent);background:var(--accent-bg)}.gn-breadcrumbs__current{color:var(--text-h);padding:2px 4px;font-weight:600}
2
2
  /*$vite$:1*/
package/dist/embed.js CHANGED
@@ -8110,11 +8110,86 @@ function yf(e) {
8110
8110
  };
8111
8111
  }
8112
8112
  //#endregion
8113
- //#region src/gn/ir/curvePath.ts
8113
+ //#region src/gn/exporter/nodebpyExporter.ts
8114
8114
  function bf(e, t) {
8115
+ let n = e.node_trees;
8116
+ if (!Array.isArray(n) || t.size === 0) return e;
8117
+ let r = new Map(n.map((e) => [e.id, e])), i = /* @__PURE__ */ new Set(), a = [];
8118
+ for (let e of n) for (let n of e.data.nodes.data.items) {
8119
+ let e = n.data.node_tree;
8120
+ t.has(n.id) && e != null && r.has(e) && a.push(e);
8121
+ }
8122
+ for (; a.length > 0;) {
8123
+ let e = a.pop();
8124
+ if (!i.has(e)) {
8125
+ i.add(e);
8126
+ for (let t of r.get(e).data.nodes.data.items) {
8127
+ let e = t.data.node_tree;
8128
+ e != null && r.has(e) && a.push(e);
8129
+ }
8130
+ }
8131
+ }
8132
+ let o = [];
8133
+ for (let e of n) {
8134
+ if (i.has(e.id)) {
8135
+ o.push(e);
8136
+ continue;
8137
+ }
8138
+ let n = e.data.nodes.data.items.filter((e) => t.has(e.id));
8139
+ if (n.length === 0) continue;
8140
+ let r = /* @__PURE__ */ new Set();
8141
+ for (let e of n) {
8142
+ for (let t of e.data.inputs?.data.items ?? []) r.add(t.id);
8143
+ for (let t of e.data.outputs?.data.items ?? []) r.add(t.id);
8144
+ }
8145
+ let a = e.data.links.data.items.filter((e) => r.has(e.data.from_socket) && r.has(e.data.to_socket));
8146
+ o.push({
8147
+ ...e,
8148
+ data: {
8149
+ ...e.data,
8150
+ nodes: {
8151
+ ...e.data.nodes,
8152
+ data: {
8153
+ ...e.data.nodes.data,
8154
+ items: n
8155
+ }
8156
+ },
8157
+ links: {
8158
+ ...e.data.links,
8159
+ data: {
8160
+ ...e.data.links.data,
8161
+ items: a
8162
+ }
8163
+ }
8164
+ }
8165
+ });
8166
+ }
8167
+ return o.length === 0 ? e : {
8168
+ ...e,
8169
+ node_trees: o
8170
+ };
8171
+ }
8172
+ //#endregion
8173
+ //#region src/utils/encodeTreeClipperPayload.ts
8174
+ var xf = "TreeClipper::";
8175
+ function Sf(e) {
8176
+ let t = "", n = 32768;
8177
+ for (let r = 0; r < e.length; r += n) t += String.fromCharCode(...e.subarray(r, r + n));
8178
+ return btoa(t);
8179
+ }
8180
+ async function Cf(e) {
8181
+ let t = new Blob([e]).stream().pipeThrough(new CompressionStream("gzip")), n = await new Response(t).arrayBuffer();
8182
+ return new Uint8Array(n);
8183
+ }
8184
+ async function wf(e) {
8185
+ return xf + Sf(await Cf(new TextEncoder().encode(e)));
8186
+ }
8187
+ //#endregion
8188
+ //#region src/gn/ir/curvePath.ts
8189
+ function Tf(e, t) {
8115
8190
  return Math.sqrt(e * e + t * t);
8116
8191
  }
8117
- function xf(e) {
8192
+ function Ef(e) {
8118
8193
  let t = e.length, n = e.map(({ location: [n, r], handleType: i }, a) => {
8119
8194
  let o = a > 0 ? e[a - 1].location : null, s = a < t - 1 ? e[a + 1].location : null;
8120
8195
  if (i === "VECTOR") return {
@@ -8124,11 +8199,11 @@ function xf(e) {
8124
8199
  let c = 0, l = 0, u = 0, d = 0;
8125
8200
  if (o && s) {
8126
8201
  let e = n - o[0], t = r - o[1], i = s[0] - n, a = s[1] - r;
8127
- if (u = bf(e, t), d = bf(i, a), u > 1e-8 && d > 1e-8) {
8128
- let n = e / u + i / d, r = t / u + a / d, o = bf(n, r);
8202
+ if (u = Tf(e, t), d = Tf(i, a), u > 1e-8 && d > 1e-8) {
8203
+ let n = e / u + i / d, r = t / u + a / d, o = Tf(n, r);
8129
8204
  o > 1e-8 && (c = n / o, l = r / o);
8130
8205
  } else d > 1e-8 ? (c = (s[0] - n) / d, l = (s[1] - r) / d) : u > 1e-8 && (c = (n - o[0]) / u, l = (r - o[1]) / u);
8131
- } else s ? (d = bf(s[0] - n, s[1] - r), d > 1e-8 && (c = (s[0] - n) / d, l = (s[1] - r) / d)) : o && (u = bf(n - o[0], r - o[1]), u > 1e-8 && (c = (n - o[0]) / u, l = (r - o[1]) / u));
8206
+ } else s ? (d = Tf(s[0] - n, s[1] - r), d > 1e-8 && (c = (s[0] - n) / d, l = (s[1] - r) / d)) : o && (u = Tf(n - o[0], r - o[1]), u > 1e-8 && (c = (n - o[0]) / u, l = (r - o[1]) / u));
8132
8207
  let f = [n - c * u / 3, r - l * u / 3], p = [n + c * d / 3, r + l * d / 3];
8133
8208
  if (i === "AUTO_CLAMPED") {
8134
8209
  if (o) {
@@ -8173,7 +8248,7 @@ function xf(e) {
8173
8248
  }
8174
8249
  return n;
8175
8250
  }
8176
- function Sf(e, t, n, r, i, a, o) {
8251
+ function Df(e, t, n, r, i, a, o) {
8177
8252
  let s = r - t || 1, c = i - n || 1, l = (e) => (e - t) / s * a, u = (e) => (1 - (e - n) / c) * o;
8178
8253
  if (e.length < 2) return {
8179
8254
  strokePath: "",
@@ -8181,7 +8256,7 @@ function Sf(e, t, n, r, i, a, o) {
8181
8256
  zeroLinePath: "",
8182
8257
  dotPositions: []
8183
8258
  };
8184
- let d = xf(e), [f, p] = e[0].location, m = `M ${l(f).toFixed(2)} ${u(p).toFixed(2)}`;
8259
+ let d = Ef(e), [f, p] = e[0].location, m = `M ${l(f).toFixed(2)} ${u(p).toFixed(2)}`;
8185
8260
  for (let t = 0; t < e.length - 1; t++) {
8186
8261
  let n = d[t].right, r = d[t + 1].left, [i, a] = e[t + 1].location;
8187
8262
  m += ` C ${l(n[0]).toFixed(2)} ${u(n[1]).toFixed(2)},`, m += ` ${l(r[0]).toFixed(2)} ${u(r[1]).toFixed(2)},`, m += ` ${l(i).toFixed(2)} ${u(a).toFixed(2)}`;
@@ -8196,18 +8271,18 @@ function Sf(e, t, n, r, i, a, o) {
8196
8271
  }
8197
8272
  //#endregion
8198
8273
  //#region src/gn/components/groupNavContext.ts
8199
- var Cf = t(null);
8200
- function wf() {
8201
- return o(Cf);
8274
+ var Of = t(null);
8275
+ function kf() {
8276
+ return o(Of);
8202
8277
  }
8203
8278
  //#endregion
8204
8279
  //#region src/gn/components/GenericGNNode.tsx
8205
- var Tf = [
8280
+ var Af = [
8206
8281
  "X",
8207
8282
  "Y",
8208
8283
  "Z",
8209
8284
  "W"
8210
- ], Ef = {
8285
+ ], jf = {
8211
8286
  FLOAT: "Float",
8212
8287
  INT: "Integer",
8213
8288
  VECTOR: "Vector",
@@ -8215,7 +8290,7 @@ var Tf = [
8215
8290
  STRING: "String",
8216
8291
  BOOLEAN: "Boolean",
8217
8292
  ROTATION: "Rotation"
8218
- }, Df = {
8293
+ }, Mf = {
8219
8294
  EQUAL: "Equal",
8220
8295
  NOT_EQUAL: "Not Equal",
8221
8296
  LESS_THAN: "Less Than",
@@ -8261,10 +8336,10 @@ var Tf = [
8261
8336
  RADIANS: "To Radians",
8262
8337
  DEGREES: "To Degrees"
8263
8338
  };
8264
- function Of(e, t) {
8265
- return e === "data_type" ? Ef[t] ?? t : e === "operation" ? Df[t] ?? t : e === "use_clamp" ? "Clamp" : t;
8339
+ function Nf(e, t) {
8340
+ return e === "data_type" ? jf[t] ?? t : e === "operation" ? Mf[t] ?? t : e === "use_clamp" ? "Clamp" : t;
8266
8341
  }
8267
- function kf(e) {
8342
+ function Pf(e) {
8268
8343
  switch (e) {
8269
8344
  case "LINE": return "gn-socket--line";
8270
8345
  case "DIAMOND": return "gn-socket--diamond";
@@ -8273,55 +8348,55 @@ function kf(e) {
8273
8348
  default: return "gn-socket--circle";
8274
8349
  }
8275
8350
  }
8276
- function Af(e) {
8351
+ function Ff(e) {
8277
8352
  return e === "ROTATION" ? "°" : e === "FLOAT" ? " m" : "";
8278
8353
  }
8279
- function jf(e) {
8354
+ function If(e) {
8280
8355
  return parseFloat(e.toFixed(3)).toString();
8281
8356
  }
8282
- function Mf(e, t) {
8283
- return typeof e == "boolean" ? e ? "True" : "False" : typeof e == "string" ? e : `${jf(e)}${Af(t)}`;
8357
+ function Lf(e, t) {
8358
+ return typeof e == "boolean" ? e ? "True" : "False" : typeof e == "string" ? e : `${If(e)}${Ff(t)}`;
8284
8359
  }
8285
- function Nf(e) {
8360
+ function Rf(e) {
8286
8361
  return Math.round(Math.min(1, Math.max(0, e)) * 255);
8287
8362
  }
8288
- function Pf(e) {
8363
+ function zf(e) {
8289
8364
  let [t, n, r, i = 1] = e.values;
8290
8365
  return /* @__PURE__ */ g("div", {
8291
8366
  className: "gn-node__color-swatch",
8292
- style: { background: `rgba(${Nf(t)},${Nf(n)},${Nf(r)},${i.toFixed(2)})` }
8367
+ style: { background: `rgba(${Rf(t)},${Rf(n)},${Rf(r)},${i.toFixed(2)})` }
8293
8368
  });
8294
8369
  }
8295
- function Ff(e) {
8296
- if (e.dataType === "RGBA") return /* @__PURE__ */ g(Pf, { values: e.values });
8297
- let t = Af(e.dataType);
8370
+ function Bf(e) {
8371
+ if (e.dataType === "RGBA") return /* @__PURE__ */ g(zf, { values: e.values });
8372
+ let t = Ff(e.dataType);
8298
8373
  return /* @__PURE__ */ g("div", {
8299
8374
  className: "gn-node__vec-block",
8300
8375
  children: e.values.slice(0, 4).map((e, n) => /* @__PURE__ */ _("div", {
8301
8376
  className: "gn-node__vec-row",
8302
8377
  children: [/* @__PURE__ */ g("span", {
8303
8378
  className: "gn-node__vec-label",
8304
- children: Tf[n]
8379
+ children: Af[n]
8305
8380
  }), /* @__PURE__ */ _("span", {
8306
8381
  className: "gn-node__vec-value",
8307
- children: [jf(e), t]
8382
+ children: [If(e), t]
8308
8383
  })]
8309
8384
  }, n))
8310
8385
  });
8311
8386
  }
8312
- function If({ properties: e }) {
8387
+ function Vf({ properties: e }) {
8313
8388
  let t = Object.entries(e);
8314
8389
  return t.length === 0 ? null : /* @__PURE__ */ g("div", {
8315
8390
  className: "gn-node__props",
8316
8391
  children: t.map(([e, t]) => /* @__PURE__ */ g("div", {
8317
8392
  className: "gn-node__prop-row",
8318
- children: Of(e, t)
8393
+ children: Nf(e, t)
8319
8394
  }, e))
8320
8395
  });
8321
8396
  }
8322
- var Lf = 120, Rf = 6;
8323
- function zf({ curve: e, width: t }) {
8324
- let n = Math.max(10, t - Rf * 2), r = Lf, { strokePath: i, fillPath: a, zeroLinePath: o, dotPositions: s } = Sf(e.points, e.clipMinX, e.clipMinY, e.clipMaxX, e.clipMaxY, n, r);
8397
+ var Hf = 120, Uf = 6;
8398
+ function Wf({ curve: e, width: t }) {
8399
+ let n = Math.max(10, t - Uf * 2), r = Hf, { strokePath: i, fillPath: a, zeroLinePath: o, dotPositions: s } = Df(e.points, e.clipMinX, e.clipMinY, e.clipMaxX, e.clipMaxY, n, r);
8325
8400
  return /* @__PURE__ */ g("div", {
8326
8401
  className: "gn-node__curve-wrap",
8327
8402
  children: /* @__PURE__ */ _("svg", {
@@ -8352,7 +8427,7 @@ function zf({ curve: e, width: t }) {
8352
8427
  })
8353
8428
  });
8354
8429
  }
8355
- function Bf(e) {
8430
+ function Gf(e) {
8356
8431
  let { socket: t, position: n, type: r, align: i, suppressDefault: a } = e, o = t.name.trim().length === 0, s = !a && !t.hideValue && t.defaultValue?.kind === "scalar";
8357
8432
  return /* @__PURE__ */ _("div", {
8358
8433
  className: `gn-node__socket-row gn-node__socket-row--${i}`,
@@ -8361,7 +8436,7 @@ function Bf(e) {
8361
8436
  id: t.id,
8362
8437
  type: r,
8363
8438
  position: n,
8364
- className: `gn-socket ${kf(t.displayShape)}`,
8439
+ className: `gn-socket ${Pf(t.displayShape)}`,
8365
8440
  style: {
8366
8441
  top: "50%",
8367
8442
  background: t.color,
@@ -8374,15 +8449,15 @@ function Bf(e) {
8374
8449
  }),
8375
8450
  s && t.defaultValue?.kind === "scalar" ? /* @__PURE__ */ g("span", {
8376
8451
  className: "gn-node__value",
8377
- children: Mf(t.defaultValue.value, t.dataType)
8452
+ children: Lf(t.defaultValue.value, t.dataType)
8378
8453
  }) : null
8379
8454
  ]
8380
8455
  });
8381
8456
  }
8382
- function Vf(e, t) {
8457
+ function Kf(e, t) {
8383
8458
  return !t && !e.hideValue && e.defaultValue?.kind === "vec";
8384
8459
  }
8385
- function Hf() {
8460
+ function qf() {
8386
8461
  return /* @__PURE__ */ _("div", {
8387
8462
  className: "gn-node__stack",
8388
8463
  "aria-hidden": "true",
@@ -8393,8 +8468,8 @@ function Hf() {
8393
8468
  ]
8394
8469
  });
8395
8470
  }
8396
- function Uf(e) {
8397
- let t = e.data, n = wf(), r = new Set(t.connectedInputIds ?? []), i = t.outputs.filter((e) => e.enabled), a = t.inputs.filter((e) => e.enabled), o = t.groupTreeId, s = o !== void 0 && t.groupTreeName !== void 0 && !!n;
8471
+ function Jf(e) {
8472
+ let t = e.data, n = kf(), r = new Set(t.connectedInputIds ?? []), i = t.outputs.filter((e) => e.enabled), a = t.inputs.filter((e) => e.enabled), o = t.groupTreeId, s = o !== void 0 && t.groupTreeName !== void 0 && !!n;
8398
8473
  return /* @__PURE__ */ _("div", {
8399
8474
  className: `gn-node${s ? " gn-node--group nodrag" : ""}`,
8400
8475
  onClick: s ? () => n.openGroup(o) : void 0,
@@ -8409,15 +8484,15 @@ function Uf(e) {
8409
8484
  children: t.label
8410
8485
  })
8411
8486
  }),
8412
- s && /* @__PURE__ */ g(Hf, {}),
8413
- t.properties && /* @__PURE__ */ g(If, { properties: t.properties }),
8414
- t.floatCurve && /* @__PURE__ */ g(zf, {
8487
+ s && /* @__PURE__ */ g(qf, {}),
8488
+ t.properties && /* @__PURE__ */ g(Vf, { properties: t.properties }),
8489
+ t.floatCurve && /* @__PURE__ */ g(Wf, {
8415
8490
  curve: t.floatCurve,
8416
8491
  width: t.width
8417
8492
  }),
8418
8493
  /* @__PURE__ */ _("div", {
8419
8494
  className: "gn-node__body",
8420
- children: [i.map((e) => /* @__PURE__ */ g(Bf, {
8495
+ children: [i.map((e) => /* @__PURE__ */ g(Gf, {
8421
8496
  socket: e,
8422
8497
  position: Y.Right,
8423
8498
  type: "source",
@@ -8425,13 +8500,13 @@ function Uf(e) {
8425
8500
  suppressDefault: !0
8426
8501
  }, e.id)), a.map((e) => {
8427
8502
  let t = r.has(e.id);
8428
- return /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g(Bf, {
8503
+ return /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g(Gf, {
8429
8504
  socket: e,
8430
8505
  position: Y.Left,
8431
8506
  type: "target",
8432
8507
  align: "left",
8433
8508
  suppressDefault: t
8434
- }), Vf(e, t) ? /* @__PURE__ */ g(Ff, {
8509
+ }), Kf(e, t) ? /* @__PURE__ */ g(Bf, {
8435
8510
  values: e.defaultValue.values,
8436
8511
  dataType: e.dataType
8437
8512
  }) : null] }, e.id);
@@ -8442,7 +8517,7 @@ function Uf(e) {
8442
8517
  }
8443
8518
  //#endregion
8444
8519
  //#region src/gn/components/RerouteNode.tsx
8445
- function Wf(e) {
8520
+ function Yf(e) {
8446
8521
  let t = e.data;
8447
8522
  return /* @__PURE__ */ _("div", {
8448
8523
  className: "gn-reroute",
@@ -8462,7 +8537,7 @@ function Wf(e) {
8462
8537
  }
8463
8538
  //#endregion
8464
8539
  //#region src/gn/components/SimulationZoneFrame.tsx
8465
- function Gf(e) {
8540
+ function Xf(e) {
8466
8541
  let t = e.data;
8467
8542
  return /* @__PURE__ */ g("div", {
8468
8543
  className: "gn-sim-zone",
@@ -8489,111 +8564,171 @@ function Gf(e) {
8489
8564
  }
8490
8565
  //#endregion
8491
8566
  //#region src/gn/components/GeometryNodesFlow.tsx
8492
- var Kf = {
8493
- gnNode: Uf,
8494
- rerouteNode: Wf,
8495
- simulationZone: Gf
8496
- }, qf = { padding: .08 };
8497
- function Jf(e) {
8498
- let { nodes: t, edges: n, breadcrumbs: r, onNavigate: i, onSelectionIds: o, zoomOnScroll: s = !0 } = e, { fitView: l } = ll(), u = d(null), f = d(!1), [p, m, h] = fd(t), [v, y, b] = pd(n);
8567
+ var Zf = {
8568
+ gnNode: Jf,
8569
+ rerouteNode: Yf,
8570
+ simulationZone: Xf
8571
+ }, Qf = { padding: .08 }, $f = 120;
8572
+ function ep(e) {
8573
+ let t = e.style?.height;
8574
+ if (typeof t == "number") return t;
8575
+ let n = e.data, r = Math.max(n?.inputs?.length ?? 0, n?.outputs?.length ?? 0);
8576
+ return Math.max(60, 32 + r * 18 + 16);
8577
+ }
8578
+ function tp(e) {
8579
+ let t = Infinity, n = Infinity, r = -Infinity, i = -Infinity;
8580
+ for (let a of e) {
8581
+ if (a.parentId) continue;
8582
+ let e = a.style?.width ?? a.width ?? 200, o = ep(a);
8583
+ t = Math.min(t, a.position.x), n = Math.min(n, a.position.y), r = Math.max(r, a.position.x + e), i = Math.max(i, a.position.y + o);
8584
+ }
8585
+ return Number.isFinite(t) ? [[t - $f, n - $f], [r + $f, i + $f]] : [[-Infinity, -Infinity], [Infinity, Infinity]];
8586
+ }
8587
+ function np(e) {
8588
+ let { nodes: t, edges: n, jsonText: r, breadcrumbs: i, onNavigate: o, onSelectionIds: s, zoomOnScroll: l = !0 } = e, { fitView: p } = ll(), m = d(null), h = d(!1), v = d([]), [y, b] = f(null), [x, S] = f(!1), [C, w, T] = fd(t), [E, D, O] = pd(n), k = u(() => tp(t), [t]);
8499
8589
  c(() => {
8500
- m(t), o?.([]), f.current = !1, l(qf);
8590
+ w(t), s?.([]), h.current = !1, p(Qf);
8501
8591
  }, [
8502
8592
  t,
8503
- m,
8504
- o,
8505
- l
8593
+ w,
8594
+ s,
8595
+ p
8506
8596
  ]), c(() => {
8507
- y(n);
8508
- }, [n, y]), c(() => {
8509
- let e = u.current;
8597
+ D(n);
8598
+ }, [n, D]), c(() => {
8599
+ let e = m.current;
8510
8600
  if (!e) return;
8511
8601
  let t = new ResizeObserver(() => {
8512
- f.current || l(qf);
8602
+ h.current || p(Qf);
8513
8603
  });
8514
8604
  return t.observe(e), () => t.disconnect();
8515
- }, [l]);
8516
- let x = a((e) => {
8517
- e && (f.current = !0);
8518
- }, []);
8519
- return /* @__PURE__ */ g("div", {
8520
- ref: u,
8605
+ }, [p]);
8606
+ let A = a((e) => {
8607
+ e && (h.current = !0);
8608
+ }, []), j = a(({ nodes: e }) => {
8609
+ let t = e.map((e) => e.id);
8610
+ v.current = t, s?.(t);
8611
+ }, [s]), M = a((e) => {
8612
+ e.preventDefault(), b({
8613
+ x: e.clientX,
8614
+ y: e.clientY
8615
+ });
8616
+ }, []), N = a(async () => {
8617
+ b(null);
8618
+ try {
8619
+ let e = JSON.parse(r), t = new Set(v.current.map(Number).filter(Number.isFinite)), n = t.size > 0 ? bf(e, t) : e, i = await wf(JSON.stringify(n));
8620
+ await navigator.clipboard.writeText(i), S(!0), setTimeout(() => S(!1), 2500);
8621
+ } catch {}
8622
+ }, [r]);
8623
+ return c(() => {
8624
+ if (!y) return;
8625
+ let e = () => b(null), t = (e) => {
8626
+ e.key === "Escape" && b(null);
8627
+ };
8628
+ return window.addEventListener("click", e), window.addEventListener("scroll", e, !0), window.addEventListener("keydown", t), () => {
8629
+ window.removeEventListener("click", e), window.removeEventListener("scroll", e, !0), window.removeEventListener("keydown", t);
8630
+ };
8631
+ }, [y]), /* @__PURE__ */ _("div", {
8632
+ ref: m,
8521
8633
  style: {
8522
8634
  width: "100%",
8523
- height: "100%"
8635
+ height: "100%",
8636
+ position: "relative"
8524
8637
  },
8525
- children: /* @__PURE__ */ _(dd, {
8526
- nodes: p,
8527
- edges: v,
8528
- onNodesChange: h,
8529
- onEdgesChange: b,
8530
- onSelectionChange: a(({ nodes: e }) => {
8531
- o?.(e.map((e) => e.id));
8532
- }, [o]),
8533
- onMoveStart: x,
8534
- nodeTypes: Kf,
8535
- fitView: !0,
8536
- fitViewOptions: qf,
8537
- minZoom: .2,
8538
- nodesDraggable: !1,
8539
- nodesConnectable: !1,
8540
- elementsSelectable: !0,
8541
- nodesFocusable: !1,
8542
- edgesFocusable: !1,
8543
- selectNodesOnDrag: !1,
8544
- selectionOnDrag: !0,
8545
- selectionMode: va.Partial,
8546
- connectOnClick: !1,
8547
- panOnDrag: [1, 2],
8548
- panOnScroll: !1,
8549
- zoomOnScroll: s,
8550
- preventScrolling: s,
8551
- zoomOnDoubleClick: !1,
8552
- children: [
8553
- /* @__PURE__ */ g(bd, {
8554
- gap: 20,
8555
- size: 1
8556
- }),
8557
- /* @__PURE__ */ g(kd, { showInteractive: !1 }),
8558
- /* @__PURE__ */ g(Sc, {
8559
- position: "top-right",
8560
- children: /* @__PURE__ */ _("span", {
8561
- className: "gn-version-badge",
8562
- children: ["web-render v", "0.3.6"]
8563
- })
8564
- }),
8565
- r.length > 1 ? /* @__PURE__ */ g(Sc, {
8566
- position: "top-left",
8567
- children: /* @__PURE__ */ g("nav", {
8568
- className: "gn-breadcrumbs",
8569
- "aria-label": "Node group path",
8570
- children: r.map((e, t) => {
8571
- let n = t === r.length - 1;
8572
- return /* @__PURE__ */ _("span", {
8573
- className: "gn-breadcrumbs__item",
8574
- children: [t > 0 ? /* @__PURE__ */ g("span", {
8575
- className: "gn-breadcrumbs__sep",
8576
- "aria-hidden": "true",
8577
- children: ""
8578
- }) : null, n ? /* @__PURE__ */ g("span", {
8579
- className: "gn-breadcrumbs__current",
8580
- "aria-current": "page",
8581
- children: e.label
8582
- }) : /* @__PURE__ */ g("button", {
8583
- type: "button",
8584
- className: "gn-breadcrumbs__link",
8585
- onClick: () => i(t),
8586
- children: e.label
8587
- })]
8588
- }, `${e.id}-${t}`);
8638
+ onContextMenu: M,
8639
+ children: [
8640
+ /* @__PURE__ */ _(dd, {
8641
+ nodes: C,
8642
+ edges: E,
8643
+ onNodesChange: T,
8644
+ onEdgesChange: O,
8645
+ onSelectionChange: j,
8646
+ onMoveStart: A,
8647
+ nodeTypes: Zf,
8648
+ fitView: !0,
8649
+ fitViewOptions: Qf,
8650
+ minZoom: .2,
8651
+ translateExtent: k,
8652
+ nodesDraggable: !1,
8653
+ nodesConnectable: !1,
8654
+ elementsSelectable: !0,
8655
+ nodesFocusable: !1,
8656
+ edgesFocusable: !1,
8657
+ selectNodesOnDrag: !1,
8658
+ selectionOnDrag: !0,
8659
+ selectionMode: va.Partial,
8660
+ connectOnClick: !1,
8661
+ panOnDrag: [1, 2],
8662
+ panOnScroll: !1,
8663
+ zoomOnScroll: l,
8664
+ preventScrolling: l,
8665
+ zoomOnDoubleClick: !1,
8666
+ children: [
8667
+ /* @__PURE__ */ g(bd, {
8668
+ gap: 20,
8669
+ size: 1
8670
+ }),
8671
+ /* @__PURE__ */ g(kd, { showInteractive: !1 }),
8672
+ /* @__PURE__ */ g(Sc, {
8673
+ position: "top-left",
8674
+ children: /* @__PURE__ */ _("div", {
8675
+ className: "gn-top-left",
8676
+ children: [/* @__PURE__ */ _("span", {
8677
+ className: "gn-version-badge",
8678
+ children: ["node-web-render v", "0.3.8"]
8679
+ }), i.length > 1 ? /* @__PURE__ */ g("nav", {
8680
+ className: "gn-breadcrumbs",
8681
+ "aria-label": "Node group path",
8682
+ children: i.map((e, t) => {
8683
+ let n = t === i.length - 1;
8684
+ return /* @__PURE__ */ _("span", {
8685
+ className: "gn-breadcrumbs__item",
8686
+ children: [t > 0 ? /* @__PURE__ */ g("span", {
8687
+ className: "gn-breadcrumbs__sep",
8688
+ "aria-hidden": "true",
8689
+ children: ""
8690
+ }) : null, n ? /* @__PURE__ */ g("span", {
8691
+ className: "gn-breadcrumbs__current",
8692
+ "aria-current": "page",
8693
+ children: e.label
8694
+ }) : /* @__PURE__ */ g("button", {
8695
+ type: "button",
8696
+ className: "gn-breadcrumbs__link",
8697
+ onClick: () => o(t),
8698
+ children: e.label
8699
+ })]
8700
+ }, `${e.id}-${t}`);
8701
+ })
8702
+ }) : null]
8589
8703
  })
8590
8704
  })
8591
- }) : null
8592
- ]
8593
- })
8705
+ ]
8706
+ }),
8707
+ y ? /* @__PURE__ */ g("div", {
8708
+ className: "gn-context-menu",
8709
+ style: {
8710
+ left: y.x,
8711
+ top: y.y
8712
+ },
8713
+ onClick: (e) => e.stopPropagation(),
8714
+ role: "menu",
8715
+ children: /* @__PURE__ */ g("button", {
8716
+ type: "button",
8717
+ className: "gn-context-menu__item",
8718
+ role: "menuitem",
8719
+ onClick: N,
8720
+ children: "Copy selected nodes to Tree Clipper magic string"
8721
+ })
8722
+ }) : null,
8723
+ x ? /* @__PURE__ */ g("div", {
8724
+ className: "gn-context-toast",
8725
+ role: "status",
8726
+ children: "Copied Tree Clipper magic string"
8727
+ }) : null
8728
+ ]
8594
8729
  });
8595
8730
  }
8596
- function Yf(e) {
8731
+ function rp(e) {
8597
8732
  let { jsonText: t, showHeader: n = !0, onSelectionChange: r, zoomOnScroll: i = !0 } = e, [o, s] = f({
8598
8733
  json: t,
8599
8734
  ids: []
@@ -8669,11 +8804,12 @@ function Yf(e) {
8669
8804
  className: "flow-error",
8670
8805
  role: "alert",
8671
8806
  children: [/* @__PURE__ */ g("strong", { children: "Parse error" }), /* @__PURE__ */ g("span", { children: l.error })]
8672
- }) : p ? /* @__PURE__ */ g(Cf.Provider, {
8807
+ }) : p ? /* @__PURE__ */ g(Of.Provider, {
8673
8808
  value: h,
8674
- children: /* @__PURE__ */ g(sd, { children: /* @__PURE__ */ g(Jf, {
8809
+ children: /* @__PURE__ */ g(sd, { children: /* @__PURE__ */ g(np, {
8675
8810
  nodes: p.flow.nodes,
8676
8811
  edges: p.flow.edges,
8812
+ jsonText: t,
8677
8813
  breadcrumbs: v,
8678
8814
  onNavigate: (e) => s({
8679
8815
  json: t,
@@ -8690,8 +8826,69 @@ function Yf(e) {
8690
8826
  });
8691
8827
  }
8692
8828
  //#endregion
8829
+ //#region src/components/TreeClipperLogo.tsx
8830
+ function ip({ className: e }) {
8831
+ return /* @__PURE__ */ _("svg", {
8832
+ viewBox: "0 0 256 256",
8833
+ className: e,
8834
+ role: "img",
8835
+ "aria-label": "Tree Clipper",
8836
+ xmlns: "http://www.w3.org/2000/svg",
8837
+ children: [/* @__PURE__ */ g("rect", {
8838
+ width: "256",
8839
+ height: "256",
8840
+ rx: "64",
8841
+ fill: "#ffffff"
8842
+ }), /* @__PURE__ */ _("g", {
8843
+ transform: "matrix(2.1731124,0,0,2.1731124,32.653222,9.9999992)",
8844
+ children: [
8845
+ /* @__PURE__ */ _("g", {
8846
+ transform: "translate(-2.9743217,-2)",
8847
+ children: [/* @__PURE__ */ g("path", {
8848
+ fill: "#ff7a00",
8849
+ d: "M 59.9,62.1 C 59.2,57.9 55.5,55 51.4,55 c -0.5,0 -1,0 -1.5,0.1 -4.7,0.8 -7.8,5.3 -7,9.9 0.7,4.2 4.4,7.1 8.5,7.1 4.1,0 1,0 1.5,-0.1 4.7,-0.8 7.8,-5.3 7,-9.9 z"
8850
+ }), /* @__PURE__ */ g("path", {
8851
+ fill: "#000099",
8852
+ d: "M 50.4,96.4 C 52.8,90.6 54.5,83 55,75.2 c -0.5,0.1 -1,0.3 -1.5,0.4 -0.7,0.1 -1.4,0.2 -2.1,0.2 -1.7,0 -3.3,-0.3 -4.8,-1 -0.7,7.7 -2.9,14.5 -5.2,18.9 0,0 -0.1,0 -0.2,0 -9.3,0 -16.9,7.5 -16.9,16.9 H 58 c 0,-5.9 -3.1,-11.2 -7.7,-14.2 z"
8853
+ })]
8854
+ }),
8855
+ /* @__PURE__ */ _("g", {
8856
+ transform: "translate(-2.9743217,-2)",
8857
+ children: [/* @__PURE__ */ g("path", {
8858
+ fill: "#000099",
8859
+ d: "m 20.1,44.4 c -0.7,-4.2 -4.4,-7.1 -8.5,-7.1 -0.6,0 -1,0 -1.5,0.1 -4.7,0.8 -7.8,5.3 -7,9.9 0.7,4.2 4.4,7.1 8.5,7.1 0.10349,0 1,0 1.5,-0.1 4.7,-0.8 7.8,-5.3 7,-9.9 z"
8860
+ }), /* @__PURE__ */ g("path", {
8861
+ fill: "#000099",
8862
+ d: "m 40.4,58.4 c -7.5,-1.4 -15,-5.3 -18.1,-8.1 -0.3,0.8 -0.7,1.5 -1.2,2.2 -0.9,1.3 -2,2.3 -3.3,3.1 3.3,3 9,6.7 14.3,8.7 2.2,0.8 4.8,1.6 7.5,2.2 0,-0.3 -0.2,-0.7 -0.2,-1 -0.4,-2.5 0,-5 1,-7.2 z"
8863
+ })]
8864
+ }),
8865
+ /* @__PURE__ */ _("g", {
8866
+ transform: "translate(-2.9743217,-2)",
8867
+ children: [/* @__PURE__ */ g("path", {
8868
+ fill: "#000099",
8869
+ d: "M 52.9,12.1 C 51.9,6.2 46.7,2 40.9,2 c -0.7,0 -1.4,0 -2.1,0.2 -6.7,1.2 -11.1,7.5 -10,14.1 1,5.9 6.2,10.1 12,10.1 0.601361,0 1.4,0 2.1,-0.2 6.7,-1.2 11.1,-7.5 10,-14.1 z"
8870
+ }), /* @__PURE__ */ g("path", {
8871
+ fill: "#000099",
8872
+ d: "m 50.4,26.1 c -1.9,1.5 -4.1,2.5 -6.5,3 1.8,2.8 3.1,7.4 4.1,12.5 0.7,3.3 0.9,6.7 0.9,9.9 0.2,0 0.3,0 0.5,0 0.7,-0.1 1.4,-0.2 2.1,-0.2 v 0 c 2.1,0 4.1,0.5 5.9,1.5 0,-10.1 -2.9,-20.4 -7,-26.7 z"
8873
+ })]
8874
+ }),
8875
+ /* @__PURE__ */ _("g", {
8876
+ transform: "translate(-2.9743217,-2)",
8877
+ children: [/* @__PURE__ */ g("path", {
8878
+ fill: "#000099",
8879
+ d: "m 90.6,26.7 c -0.7,-4.2 -4.400023,-7.113594 -8.5,-7.1 -0.658419,0.0022 -1,0 -1.5,0.1 -4.7,0.8 -7.8,5.3 -7,9.9 0.7,4.2 4.4,7.1 8.5,7.1 0.228046,0 1,0 1.5,-0.1 4.7,-0.8 7.8,-5.3 7,-9.9 z"
8880
+ }), /* @__PURE__ */ g("path", {
8881
+ fill: "#000099",
8882
+ d: "m 66.6,50.9 c -1.8,1.8 -3.9,3.3 -6,4.6 1.5,1.6 2.5,3.7 2.9,6 0.1,0.7 0.2,1.4 0.2,2 2.5,-1.7 5,-3.7 7.3,-5.9 5.4,-5.3 9.1,-12 10.6,-17.8 -2.5,-0.1 -4.8,-1 -6.6,-2.4 -1.1,4.6 -3.7,9 -8.4,13.5 z"
8883
+ })]
8884
+ })
8885
+ ]
8886
+ })]
8887
+ });
8888
+ }
8889
+ //#endregion
8693
8890
  //#region src/embed.tsx
8694
- function Xf(e) {
8891
+ function ap(e) {
8695
8892
  let { payload: t } = e, [n, r] = f(""), [i, a] = f(null), [o, s] = f(!0), [l, u] = f(!1);
8696
8893
  return c(() => {
8697
8894
  let e = !1;
@@ -8706,20 +8903,28 @@ function Xf(e) {
8706
8903
  className: "geonodes-embed geonodes-embed--dark",
8707
8904
  children: /* @__PURE__ */ g("div", {
8708
8905
  className: "geonodes-embed__body",
8709
- children: o ? /* @__PURE__ */ g("div", {
8710
- className: "flow-empty",
8711
- children: "Decoding…"
8906
+ children: o ? /* @__PURE__ */ _("div", {
8907
+ className: "gnwr-loading",
8908
+ role: "status",
8909
+ "aria-live": "polite",
8910
+ children: [/* @__PURE__ */ g("span", {
8911
+ className: "gnwr-loading__spinner",
8912
+ "aria-hidden": "true"
8913
+ }), /* @__PURE__ */ g("span", {
8914
+ className: "gnwr-loading__label",
8915
+ children: "Loading graph…"
8916
+ })]
8712
8917
  }) : i ? /* @__PURE__ */ _("div", {
8713
8918
  className: "flow-error",
8714
8919
  role: "alert",
8715
8920
  children: [/* @__PURE__ */ g("strong", { children: "Decode error" }), /* @__PURE__ */ g("span", { children: i })]
8716
8921
  }) : /* @__PURE__ */ _(h, { children: [
8717
- /* @__PURE__ */ g(Yf, {
8922
+ /* @__PURE__ */ g(rp, {
8718
8923
  jsonText: n,
8719
8924
  showHeader: !1,
8720
8925
  zoomOnScroll: !1
8721
8926
  }),
8722
- /* @__PURE__ */ g("button", {
8927
+ /* @__PURE__ */ _("button", {
8723
8928
  type: "button",
8724
8929
  className: "gnwr-copy-button",
8725
8930
  onClick: async () => {
@@ -8728,13 +8933,13 @@ function Xf(e) {
8728
8933
  } catch {}
8729
8934
  },
8730
8935
  title: "Copy the Tree Clipper magic string — paste into Blender with the Tree Clipper add-on",
8731
- children: "Copy TreeClipper Magic String"
8936
+ children: [/* @__PURE__ */ g(ip, { className: "gnwr-copy-button__logo" }), /* @__PURE__ */ g("span", { children: "Copy TreeClipper Magic String" })]
8732
8937
  }),
8733
8938
  l && /* @__PURE__ */ _("div", {
8734
8939
  className: "gnwr-copy-toast",
8735
8940
  role: "status",
8736
8941
  children: [
8737
- "Now, You Can Use This Magic String In Blender With The",
8942
+ "Now, you can use this magic string in Blender with the",
8738
8943
  " ",
8739
8944
  /* @__PURE__ */ g("a", {
8740
8945
  href: "https://extensions.blender.org/add-ons/tree-clipper/",
@@ -8744,29 +8949,29 @@ function Xf(e) {
8744
8949
  children: "Tree Clipper Extension"
8745
8950
  }),
8746
8951
  " ",
8747
- "Installed."
8952
+ "installed."
8748
8953
  ]
8749
8954
  })
8750
8955
  ] })
8751
8956
  })
8752
8957
  });
8753
8958
  }
8754
- var Zf = /* @__PURE__ */ new Map(), Qf = null;
8755
- function $f(e, t) {
8756
- Zf.get(e)?.unmount();
8959
+ var op = /* @__PURE__ */ new Map(), sp = null;
8960
+ function cp(e, t) {
8961
+ op.get(e)?.unmount();
8757
8962
  let r = m(e);
8758
- Zf.set(e, r), Qf = e;
8963
+ op.set(e, r), sp = e;
8759
8964
  let i = t.onClose;
8760
- return r.render(n(Xf, {
8965
+ return r.render(n(ap, {
8761
8966
  ...t,
8762
8967
  onClose: i ? () => {
8763
- ep(e), i();
8968
+ lp(e), i();
8764
8969
  } : void 0
8765
- })), () => ep(e);
8970
+ })), () => lp(e);
8766
8971
  }
8767
- function ep(e) {
8768
- let t = e ?? Qf;
8769
- t && (Zf.get(t)?.unmount(), Zf.delete(t), t === Qf && (Qf = null));
8972
+ function lp(e) {
8973
+ let t = e ?? sp;
8974
+ t && (op.get(t)?.unmount(), op.delete(t), t === sp && (sp = null));
8770
8975
  }
8771
8976
  //#endregion
8772
- export { Xf as GraphView, $f as mountGraphView, ep as unmountGraphView };
8977
+ export { ap as GraphView, cp as mountGraphView, lp as unmountGraphView };
@@ -0,0 +1,3 @@
1
+ /** Encode a JSON string into a Tree Clipper magic string ("TreeClipper::" + base64 of gzip).
2
+ * Inverse of decodeTreeClipperPayload. */
3
+ export declare function encodeTreeClipperPayload(jsonText: string): Promise<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "geonodes-web-render",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Browser-based viewer for Blender Geometry Nodes exported via Tree Clipper. Renders node trees as a read-only, Blender-styled graph.",
5
5
  "type": "module",
6
6
  "exports": {