geonodes-web-render 0.3.5 → 0.3.7

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}.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:10px;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: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-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;padding:6px 12px;font-size:12px;transition:opacity .15s,border-color .15s,color .15s;position:absolute;top:10px;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: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,104 +8564,155 @@ 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 };
8572
+ function $f(e) {
8573
+ let { nodes: t, edges: n, jsonText: r, breadcrumbs: i, onNavigate: o, onSelectionIds: s, zoomOnScroll: l = !0 } = e, { fitView: u } = ll(), p = d(null), m = d(!1), h = d([]), [v, y] = f(null), [b, x] = f(!1), [S, C, w] = fd(t), [T, E, D] = pd(n);
8499
8574
  c(() => {
8500
- m(t), o?.([]), f.current = !1, l(qf);
8575
+ C(t), s?.([]), m.current = !1, u(Qf);
8501
8576
  }, [
8502
8577
  t,
8503
- m,
8504
- o,
8505
- l
8578
+ C,
8579
+ s,
8580
+ u
8506
8581
  ]), c(() => {
8507
- y(n);
8508
- }, [n, y]), c(() => {
8509
- let e = u.current;
8582
+ E(n);
8583
+ }, [n, E]), c(() => {
8584
+ let e = p.current;
8510
8585
  if (!e) return;
8511
8586
  let t = new ResizeObserver(() => {
8512
- f.current || l(qf);
8587
+ m.current || u(Qf);
8513
8588
  });
8514
8589
  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,
8590
+ }, [u]);
8591
+ let O = a((e) => {
8592
+ e && (m.current = !0);
8593
+ }, []), k = a(({ nodes: e }) => {
8594
+ let t = e.map((e) => e.id);
8595
+ h.current = t, s?.(t);
8596
+ }, [s]), A = a((e) => {
8597
+ e.preventDefault(), y({
8598
+ x: e.clientX,
8599
+ y: e.clientY
8600
+ });
8601
+ }, []), j = a(async () => {
8602
+ y(null);
8603
+ try {
8604
+ let e = JSON.parse(r), t = new Set(h.current.map(Number).filter(Number.isFinite)), n = t.size > 0 ? bf(e, t) : e, i = await wf(JSON.stringify(n));
8605
+ await navigator.clipboard.writeText(i), x(!0), setTimeout(() => x(!1), 2500);
8606
+ } catch {}
8607
+ }, [r]);
8608
+ return c(() => {
8609
+ if (!v) return;
8610
+ let e = () => y(null), t = (e) => {
8611
+ e.key === "Escape" && y(null);
8612
+ };
8613
+ return window.addEventListener("click", e), window.addEventListener("scroll", e, !0), window.addEventListener("keydown", t), () => {
8614
+ window.removeEventListener("click", e), window.removeEventListener("scroll", e, !0), window.removeEventListener("keydown", t);
8615
+ };
8616
+ }, [v]), /* @__PURE__ */ _("div", {
8617
+ ref: p,
8521
8618
  style: {
8522
8619
  width: "100%",
8523
- height: "100%"
8620
+ height: "100%",
8621
+ position: "relative"
8524
8622
  },
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
- r.length > 1 ? /* @__PURE__ */ g(Sc, {
8559
- position: "top-left",
8560
- children: /* @__PURE__ */ g("nav", {
8561
- className: "gn-breadcrumbs",
8562
- "aria-label": "Node group path",
8563
- children: r.map((e, t) => {
8564
- let n = t === r.length - 1;
8565
- return /* @__PURE__ */ _("span", {
8566
- className: "gn-breadcrumbs__item",
8567
- children: [t > 0 ? /* @__PURE__ */ g("span", {
8568
- className: "gn-breadcrumbs__sep",
8569
- "aria-hidden": "true",
8570
- children: ""
8571
- }) : null, n ? /* @__PURE__ */ g("span", {
8572
- className: "gn-breadcrumbs__current",
8573
- "aria-current": "page",
8574
- children: e.label
8575
- }) : /* @__PURE__ */ g("button", {
8576
- type: "button",
8577
- className: "gn-breadcrumbs__link",
8578
- onClick: () => i(t),
8579
- children: e.label
8580
- })]
8581
- }, `${e.id}-${t}`);
8623
+ onContextMenu: A,
8624
+ children: [
8625
+ /* @__PURE__ */ _(dd, {
8626
+ nodes: S,
8627
+ edges: T,
8628
+ onNodesChange: w,
8629
+ onEdgesChange: D,
8630
+ onSelectionChange: k,
8631
+ onMoveStart: O,
8632
+ nodeTypes: Zf,
8633
+ fitView: !0,
8634
+ fitViewOptions: Qf,
8635
+ minZoom: .2,
8636
+ nodesDraggable: !1,
8637
+ nodesConnectable: !1,
8638
+ elementsSelectable: !0,
8639
+ nodesFocusable: !1,
8640
+ edgesFocusable: !1,
8641
+ selectNodesOnDrag: !1,
8642
+ selectionOnDrag: !0,
8643
+ selectionMode: va.Partial,
8644
+ connectOnClick: !1,
8645
+ panOnDrag: [1, 2],
8646
+ panOnScroll: !1,
8647
+ zoomOnScroll: l,
8648
+ preventScrolling: l,
8649
+ zoomOnDoubleClick: !1,
8650
+ children: [
8651
+ /* @__PURE__ */ g(bd, {
8652
+ gap: 20,
8653
+ size: 1
8654
+ }),
8655
+ /* @__PURE__ */ g(kd, { showInteractive: !1 }),
8656
+ /* @__PURE__ */ g(Sc, {
8657
+ position: "top-left",
8658
+ children: /* @__PURE__ */ _("div", {
8659
+ className: "gn-top-left",
8660
+ children: [/* @__PURE__ */ _("span", {
8661
+ className: "gn-version-badge",
8662
+ children: ["node-web-render v", "0.3.7"]
8663
+ }), i.length > 1 ? /* @__PURE__ */ g("nav", {
8664
+ className: "gn-breadcrumbs",
8665
+ "aria-label": "Node group path",
8666
+ children: i.map((e, t) => {
8667
+ let n = t === i.length - 1;
8668
+ return /* @__PURE__ */ _("span", {
8669
+ className: "gn-breadcrumbs__item",
8670
+ children: [t > 0 ? /* @__PURE__ */ g("span", {
8671
+ className: "gn-breadcrumbs__sep",
8672
+ "aria-hidden": "true",
8673
+ children: ""
8674
+ }) : null, n ? /* @__PURE__ */ g("span", {
8675
+ className: "gn-breadcrumbs__current",
8676
+ "aria-current": "page",
8677
+ children: e.label
8678
+ }) : /* @__PURE__ */ g("button", {
8679
+ type: "button",
8680
+ className: "gn-breadcrumbs__link",
8681
+ onClick: () => o(t),
8682
+ children: e.label
8683
+ })]
8684
+ }, `${e.id}-${t}`);
8685
+ })
8686
+ }) : null]
8582
8687
  })
8583
8688
  })
8584
- }) : null
8585
- ]
8586
- })
8689
+ ]
8690
+ }),
8691
+ v ? /* @__PURE__ */ g("div", {
8692
+ className: "gn-context-menu",
8693
+ style: {
8694
+ left: v.x,
8695
+ top: v.y
8696
+ },
8697
+ onClick: (e) => e.stopPropagation(),
8698
+ role: "menu",
8699
+ children: /* @__PURE__ */ g("button", {
8700
+ type: "button",
8701
+ className: "gn-context-menu__item",
8702
+ role: "menuitem",
8703
+ onClick: j,
8704
+ children: "Copy selected nodes to Tree Clipper magic string"
8705
+ })
8706
+ }) : null,
8707
+ b ? /* @__PURE__ */ g("div", {
8708
+ className: "gn-context-toast",
8709
+ role: "status",
8710
+ children: "Copied Tree Clipper magic string"
8711
+ }) : null
8712
+ ]
8587
8713
  });
8588
8714
  }
8589
- function Yf(e) {
8715
+ function ep(e) {
8590
8716
  let { jsonText: t, showHeader: n = !0, onSelectionChange: r, zoomOnScroll: i = !0 } = e, [o, s] = f({
8591
8717
  json: t,
8592
8718
  ids: []
@@ -8662,11 +8788,12 @@ function Yf(e) {
8662
8788
  className: "flow-error",
8663
8789
  role: "alert",
8664
8790
  children: [/* @__PURE__ */ g("strong", { children: "Parse error" }), /* @__PURE__ */ g("span", { children: l.error })]
8665
- }) : p ? /* @__PURE__ */ g(Cf.Provider, {
8791
+ }) : p ? /* @__PURE__ */ g(Of.Provider, {
8666
8792
  value: h,
8667
- children: /* @__PURE__ */ g(sd, { children: /* @__PURE__ */ g(Jf, {
8793
+ children: /* @__PURE__ */ g(sd, { children: /* @__PURE__ */ g($f, {
8668
8794
  nodes: p.flow.nodes,
8669
8795
  edges: p.flow.edges,
8796
+ jsonText: t,
8670
8797
  breadcrumbs: v,
8671
8798
  onNavigate: (e) => s({
8672
8799
  json: t,
@@ -8684,7 +8811,7 @@ function Yf(e) {
8684
8811
  }
8685
8812
  //#endregion
8686
8813
  //#region src/embed.tsx
8687
- function Xf(e) {
8814
+ function tp(e) {
8688
8815
  let { payload: t } = e, [n, r] = f(""), [i, a] = f(null), [o, s] = f(!0), [l, u] = f(!1);
8689
8816
  return c(() => {
8690
8817
  let e = !1;
@@ -8699,15 +8826,23 @@ function Xf(e) {
8699
8826
  className: "geonodes-embed geonodes-embed--dark",
8700
8827
  children: /* @__PURE__ */ g("div", {
8701
8828
  className: "geonodes-embed__body",
8702
- children: o ? /* @__PURE__ */ g("div", {
8703
- className: "flow-empty",
8704
- children: "Decoding…"
8829
+ children: o ? /* @__PURE__ */ _("div", {
8830
+ className: "gnwr-loading",
8831
+ role: "status",
8832
+ "aria-live": "polite",
8833
+ children: [/* @__PURE__ */ g("span", {
8834
+ className: "gnwr-loading__spinner",
8835
+ "aria-hidden": "true"
8836
+ }), /* @__PURE__ */ g("span", {
8837
+ className: "gnwr-loading__label",
8838
+ children: "Loading graph…"
8839
+ })]
8705
8840
  }) : i ? /* @__PURE__ */ _("div", {
8706
8841
  className: "flow-error",
8707
8842
  role: "alert",
8708
8843
  children: [/* @__PURE__ */ g("strong", { children: "Decode error" }), /* @__PURE__ */ g("span", { children: i })]
8709
8844
  }) : /* @__PURE__ */ _(h, { children: [
8710
- /* @__PURE__ */ g(Yf, {
8845
+ /* @__PURE__ */ g(ep, {
8711
8846
  jsonText: n,
8712
8847
  showHeader: !1,
8713
8848
  zoomOnScroll: !1
@@ -8744,22 +8879,22 @@ function Xf(e) {
8744
8879
  })
8745
8880
  });
8746
8881
  }
8747
- var Zf = /* @__PURE__ */ new Map(), Qf = null;
8748
- function $f(e, t) {
8749
- Zf.get(e)?.unmount();
8882
+ var np = /* @__PURE__ */ new Map(), rp = null;
8883
+ function ip(e, t) {
8884
+ np.get(e)?.unmount();
8750
8885
  let r = m(e);
8751
- Zf.set(e, r), Qf = e;
8886
+ np.set(e, r), rp = e;
8752
8887
  let i = t.onClose;
8753
- return r.render(n(Xf, {
8888
+ return r.render(n(tp, {
8754
8889
  ...t,
8755
8890
  onClose: i ? () => {
8756
- ep(e), i();
8891
+ ap(e), i();
8757
8892
  } : void 0
8758
- })), () => ep(e);
8893
+ })), () => ap(e);
8759
8894
  }
8760
- function ep(e) {
8761
- let t = e ?? Qf;
8762
- t && (Zf.get(t)?.unmount(), Zf.delete(t), t === Qf && (Qf = null));
8895
+ function ap(e) {
8896
+ let t = e ?? rp;
8897
+ t && (np.get(t)?.unmount(), np.delete(t), t === rp && (rp = null));
8763
8898
  }
8764
8899
  //#endregion
8765
- export { Xf as GraphView, $f as mountGraphView, ep as unmountGraphView };
8900
+ export { tp as GraphView, ip as mountGraphView, ap 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.5",
3
+ "version": "0.3.7",
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": {