| /* this gets exported as style.css and can be used for the default theming */ | ||
| /* these are the necessary styles for React/Svelte Flow, they get used by base.css and style.css */ | ||
| .react-flow { | ||
| direction: ltr; | ||
| --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: rgba(255, 255, 255, 0.5); | ||
| --xy-minimap-background-color-default: #fff; | ||
| --xy-minimap-mask-background-color-default: rgba(240, 240, 240, 0.6); | ||
| --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: rgba(240, 240, 240, 0.25); | ||
| --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, 0.08); | ||
| --xy-node-boxshadow-selected-default: 0 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: rgba(0, 89, 220, 0.08); | ||
| --xy-selection-border-default: 1px dotted rgba(0, 89, 220, 0.8); | ||
| --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 rgba(0, 0, 0, 0.08); | ||
| --xy-edge-label-background-color-default: #ffffff; | ||
| --xy-edge-label-color-default: inherit; | ||
| --xy-resize-background-color-default: #3367d9; | ||
| } | ||
| .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: rgba(150, 150, 150, 0.25); | ||
| --xy-minimap-background-color-default: #141414; | ||
| --xy-minimap-mask-background-color-default: rgba(60, 60, 60, 0.6); | ||
| --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: rgba(240, 240, 240, 0.25); | ||
| --xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, 0.08); | ||
| --xy-node-boxshadow-selected-default: 0 0 0 0.5px #999; | ||
| --xy-handle-background-color-default: #bebebe; | ||
| --xy-handle-border-color-default: #1e1e1e; | ||
| --xy-selection-background-color-default: rgba(200, 200, 220, 0.08); | ||
| --xy-selection-border-default: 1px dotted rgba(200, 200, 220, 0.8); | ||
| --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 rgba(0, 0, 0, 0.08); | ||
| --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 { | ||
| position: absolute; | ||
| width: 100%; | ||
| height: 100%; | ||
| top: 0; | ||
| left: 0; | ||
| } | ||
| .react-flow__pane { | ||
| z-index: 1; | ||
| } | ||
| .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 { | ||
| overflow: visible; | ||
| position: absolute; | ||
| pointer-events: none; | ||
| } | ||
| .react-flow__edge { | ||
| pointer-events: visibleStroke; | ||
| } | ||
| .react-flow__edge.selectable { | ||
| cursor: pointer; | ||
| } | ||
| .react-flow__edge.animated path { | ||
| stroke-dasharray: 5; | ||
| animation: dashdraw 0.5s linear infinite; | ||
| } | ||
| .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; | ||
| -moz-user-select: none; | ||
| user-select: none; | ||
| } | ||
| /* Arrowhead marker styles - use CSS custom properties as default */ | ||
| .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: dashdraw 0.5s linear infinite; | ||
| } | ||
| svg.react-flow__connectionline { | ||
| z-index: 1001; | ||
| overflow: visible; | ||
| position: absolute; | ||
| } | ||
| .react-flow__nodes { | ||
| pointer-events: none; | ||
| transform-origin: 0 0; | ||
| } | ||
| .react-flow__node { | ||
| position: absolute; | ||
| -webkit-user-select: none; | ||
| -moz-user-select: none; | ||
| user-select: none; | ||
| pointer-events: all; | ||
| transform-origin: 0 0; | ||
| box-sizing: border-box; | ||
| cursor: default; | ||
| } | ||
| .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: left top; | ||
| pointer-events: none; | ||
| } | ||
| .react-flow__nodesselection-rect { | ||
| position: absolute; | ||
| pointer-events: all; | ||
| cursor: grab; | ||
| } | ||
| .react-flow__handle { | ||
| position: absolute; | ||
| pointer-events: none; | ||
| min-width: 5px; | ||
| min-height: 5px; | ||
| width: 6px; | ||
| height: 6px; | ||
| 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%; | ||
| } | ||
| .react-flow__handle.connectingfrom { | ||
| pointer-events: all; | ||
| } | ||
| .react-flow__handle.connectionindicator { | ||
| pointer-events: all; | ||
| cursor: crosshair; | ||
| } | ||
| .react-flow__handle-bottom { | ||
| top: auto; | ||
| left: 50%; | ||
| bottom: 0; | ||
| 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 { | ||
| position: absolute; | ||
| z-index: 5; | ||
| margin: 15px; | ||
| } | ||
| .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: translateX(-15px) translateX(-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 { | ||
| font-size: 10px; | ||
| background: var(--xy-attribution-background-color, var(--xy-attribution-background-color-default)); | ||
| padding: 2px 3px; | ||
| margin: 0; | ||
| } | ||
| .react-flow__attribution a { | ||
| text-decoration: none; | ||
| color: #999; | ||
| } | ||
| @keyframes dashdraw { | ||
| from { | ||
| stroke-dashoffset: 10; | ||
| } | ||
| } | ||
| .react-flow__edgelabel-renderer { | ||
| position: absolute; | ||
| width: 100%; | ||
| height: 100%; | ||
| pointer-events: none; | ||
| -webkit-user-select: none; | ||
| -moz-user-select: none; | ||
| user-select: none; | ||
| left: 0; | ||
| top: 0; | ||
| } | ||
| .react-flow__viewport-portal { | ||
| position: absolute; | ||
| width: 100%; | ||
| height: 100%; | ||
| left: 0; | ||
| top: 0; | ||
| -webkit-user-select: none; | ||
| -moz-user-select: none; | ||
| user-select: none; | ||
| } | ||
| .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 { | ||
| display: flex; | ||
| flex-direction: column; | ||
| box-shadow: var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default)); | ||
| } | ||
| .react-flow__controls.horizontal { | ||
| flex-direction: row; | ||
| } | ||
| .react-flow__controls-button { | ||
| display: flex; | ||
| justify-content: center; | ||
| align-items: center; | ||
| height: 26px; | ||
| width: 26px; | ||
| padding: 4px; | ||
| border: none; | ||
| background: var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default)); | ||
| border-bottom: 1px solid | ||
| var( | ||
| --xy-controls-button-border-color-props, | ||
| var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) | ||
| ); | ||
| color: var( | ||
| --xy-controls-button-color-props, | ||
| var(--xy-controls-button-color, var(--xy-controls-button-color-default)) | ||
| ); | ||
| cursor: pointer; | ||
| -webkit-user-select: none; | ||
| -moz-user-select: none; | ||
| user-select: none; | ||
| } | ||
| .react-flow__controls-button svg { | ||
| width: 100%; | ||
| max-width: 12px; | ||
| max-height: 12px; | ||
| fill: currentColor; | ||
| } | ||
| .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 { | ||
| padding: 10px; | ||
| border-radius: var(--xy-node-border-radius, var(--xy-node-border-radius-default)); | ||
| width: 150px; | ||
| font-size: 12px; | ||
| 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)); | ||
| } | ||
| .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: 0.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; | ||
| } | ||
| /* handle styles */ | ||
| .react-flow__resize-control.handle { | ||
| width: 5px; | ||
| height: 5px; | ||
| border: 1px solid #fff; | ||
| border-radius: 1px; | ||
| background-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default)); | ||
| translate: -50% -50%; | ||
| } | ||
| .react-flow__resize-control.handle.left { | ||
| left: 0; | ||
| top: 50%; | ||
| } | ||
| .react-flow__resize-control.handle.right { | ||
| left: 100%; | ||
| top: 50%; | ||
| } | ||
| .react-flow__resize-control.handle.top { | ||
| left: 50%; | ||
| top: 0; | ||
| } | ||
| .react-flow__resize-control.handle.bottom { | ||
| left: 50%; | ||
| top: 100%; | ||
| } | ||
| .react-flow__resize-control.handle.top.left { | ||
| left: 0; | ||
| } | ||
| .react-flow__resize-control.handle.bottom.left { | ||
| left: 0; | ||
| } | ||
| .react-flow__resize-control.handle.top.right { | ||
| left: 100%; | ||
| } | ||
| .react-flow__resize-control.handle.bottom.right { | ||
| left: 100%; | ||
| } | ||
| /* line styles */ | ||
| .react-flow__resize-control.line { | ||
| border-color: var(--xy-resize-background-color, var(--xy-resize-background-color-default)); | ||
| border-width: 0; | ||
| border-style: solid; | ||
| } | ||
| .react-flow__resize-control.line.left, | ||
| .react-flow__resize-control.line.right { | ||
| width: 1px; | ||
| transform: translate(-50%, 0); | ||
| top: 0; | ||
| height: 100%; | ||
| } | ||
| .react-flow__resize-control.line.left { | ||
| left: 0; | ||
| border-left-width: 1px; | ||
| } | ||
| .react-flow__resize-control.line.right { | ||
| left: 100%; | ||
| border-right-width: 1px; | ||
| } | ||
| .react-flow__resize-control.line.top, | ||
| .react-flow__resize-control.line.bottom { | ||
| height: 1px; | ||
| transform: translate(0, -50%); | ||
| left: 0; | ||
| width: 100%; | ||
| } | ||
| .react-flow__resize-control.line.top { | ||
| top: 0; | ||
| border-top-width: 1px; | ||
| } | ||
| .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)); | ||
| } |
+69
-165
@@ -893,122 +893,74 @@ /* lens view — canvas-first with slide-in reader panel. | ||
| .wb-root { | ||
| position: absolute; | ||
| inset: 0; | ||
| overflow: hidden; | ||
| cursor: grab; | ||
| user-select: none; | ||
| } | ||
| .wb-root.panning { cursor: grabbing; } | ||
| /* React Flow owns all per-card / per-edge styling. Only the canvas host and | ||
| * the floating toolbar live in this file. */ | ||
| .wb-world { | ||
| position: absolute; | ||
| left: 0; | ||
| top: 0; | ||
| width: 0; | ||
| height: 0; | ||
| transform-origin: 0 0; | ||
| will-change: transform; | ||
| } | ||
| /* Whiteboard controls come from React Flow's <Controls>; no lens-owned | ||
| * toolbar. See whiteboard-rf.tsx for the auto-layout <ControlButton>. */ | ||
| .wb-edges { | ||
| position: absolute; | ||
| overflow: visible; | ||
| pointer-events: none; | ||
| /* LensCard — custom React Flow node showing title + truncated markdown body. | ||
| * Dimensions are fixed (matched to CARD_W / CARD_H in whiteboard-rf.tsx) | ||
| * because dagre relies on known sizes to avoid layout overlaps. */ | ||
| .react-flow__node-lensCard { | ||
| /* Let the LensCard itself own all visuals — RF's default node shell would | ||
| * add a duplicate border/background on top. */ | ||
| background: transparent; | ||
| border: none; | ||
| padding: 0; | ||
| box-shadow: none; | ||
| border-radius: 0; | ||
| font-family: inherit; | ||
| color: inherit; | ||
| width: auto; | ||
| height: auto; | ||
| } | ||
| .wb-edges .wb-edge { | ||
| opacity: 0.7; | ||
| transition: stroke-width 0.14s ease, opacity 0.14s ease; | ||
| } | ||
| .wb-edges .wb-edge.dim { opacity: 0.12; } | ||
| .wb-edges .wb-edge.highlight-card, | ||
| .wb-edges .wb-edge.highlight-edge { opacity: 1; } | ||
| .wb-edges .wb-edge.dim.highlight-edge { opacity: 1; } | ||
| .wb-pair-indicator { transition: transform 0.12s ease; } | ||
| .wb-pair-indicator:hover { filter: brightness(1.25); } | ||
| .wb-pair-indicator rect { transition: stroke 0.12s, fill-opacity 0.12s; } | ||
| .wb-pair-indicator:hover rect { stroke: var(--accent); } | ||
| .wb-card { | ||
| position: absolute; | ||
| .lens-card { | ||
| display: flex; | ||
| flex-direction: row; | ||
| background: var(--bg-panel); | ||
| border: 1px solid var(--border); | ||
| border-radius: 10px; | ||
| border-radius: 8px; | ||
| overflow: hidden; | ||
| box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35); | ||
| transition: border-color 0.15s, box-shadow 0.15s, transform 0.12s; | ||
| cursor: grab; | ||
| display: flex; | ||
| flex-direction: row; | ||
| transition: border-color 0.15s, box-shadow 0.15s; | ||
| cursor: pointer; | ||
| } | ||
| .wb-card:hover { | ||
| .lens-card:hover { | ||
| border-color: var(--accent); | ||
| box-shadow: 0 4px 14px rgba(0, 0, 0, 0.55); | ||
| } | ||
| .wb-card.dragging { cursor: grabbing; z-index: 10; transition: none; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.7); } | ||
| .wb-card.focused { | ||
| .lens-card.selected { | ||
| border-color: var(--accent); | ||
| box-shadow: 0 0 0 2px var(--accent), 0 4px 14px rgba(0, 0, 0, 0.55); | ||
| z-index: 5; | ||
| } | ||
| .wb-card.hover-incident { | ||
| border-color: var(--text); | ||
| z-index: 4; | ||
| } | ||
| .wb-card-accent { | ||
| .lens-card-accent { | ||
| width: 4px; | ||
| flex-shrink: 0; | ||
| } | ||
| .wb-card-inner { | ||
| .lens-card-inner { | ||
| flex: 1; | ||
| min-width: 0; | ||
| min-height: 0; | ||
| padding: 12px 14px 14px; | ||
| max-height: 320px; | ||
| overflow: hidden; | ||
| position: relative; | ||
| mask-image: linear-gradient(to bottom, black calc(100% - 40px), transparent); | ||
| -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 40px), transparent); | ||
| } | ||
| .wb-card-inner.no-fade { mask-image: none; -webkit-mask-image: none; } | ||
| .wb-card.is-anchor { | ||
| background: #1a1726; | ||
| border-color: rgba(163, 113, 247, 0.45); | ||
| } | ||
| .wb-card.is-anchor .wb-card-inner { max-height: 420px; } | ||
| .wb-card.is-ghost { | ||
| background: rgba(22, 27, 34, 0.75); | ||
| border-style: dashed; | ||
| border-color: rgba(139, 148, 158, 0.4); | ||
| opacity: 0.7; | ||
| box-shadow: none; | ||
| } | ||
| .wb-card.is-ghost:hover { | ||
| opacity: 1; | ||
| border-style: solid; | ||
| border-color: var(--accent); | ||
| } | ||
| .wb-card.is-ghost .wb-card-inner { | ||
| padding: 8px 10px 9px; | ||
| max-height: none; | ||
| } | ||
| .wb-card.is-ghost .wb-card-title { | ||
| font-size: 12.5px; | ||
| font-weight: 500; | ||
| margin-bottom: 2px; | ||
| white-space: nowrap; | ||
| overflow: hidden; | ||
| text-overflow: ellipsis; | ||
| } | ||
| .wb-ghost-hint { | ||
| font-size: 10px; | ||
| color: var(--text-faint); | ||
| font-style: italic; | ||
| letter-spacing: 0.03em; | ||
| /* Fade the last few lines, but ONLY when content actually overflows. The | ||
| * .truncated class is toggled by the React component after measuring | ||
| * scrollHeight vs clientHeight, so short cards stay clean. */ | ||
| .lens-card-inner.truncated::after { | ||
| content: ""; | ||
| position: absolute; | ||
| left: 0; | ||
| right: 0; | ||
| bottom: 0; | ||
| height: 36px; | ||
| background: linear-gradient(to bottom, transparent, var(--bg-panel)); | ||
| pointer-events: none; | ||
| } | ||
| .wb-card-title { | ||
| font-size: 14px; | ||
| .lens-card-title { | ||
| font-size: 13.5px; | ||
| font-weight: 600; | ||
@@ -1020,5 +972,3 @@ color: var(--text); | ||
| } | ||
| .wb-card.is-anchor .wb-card-title { font-size: 16px; color: var(--rel-indexes); } | ||
| .wb-card-meta { | ||
| .lens-card-meta { | ||
| font-size: 10.5px; | ||
@@ -1028,28 +978,24 @@ color: var(--text-faint); | ||
| letter-spacing: 0.04em; | ||
| margin-bottom: 8px; | ||
| margin-bottom: 6px; | ||
| } | ||
| .wb-card-body { | ||
| font-size: 12.5px; | ||
| .lens-card-body { | ||
| font-size: 12px; | ||
| color: var(--text-dim); | ||
| line-height: 1.5; | ||
| line-height: 1.45; | ||
| } | ||
| .wb-card-body > :first-child { margin-top: 0; } | ||
| .wb-card-body > :last-child { margin-bottom: 0; } | ||
| .wb-card-body h1, .wb-card-body h2, .wb-card-body h3, .wb-card-body h4 { | ||
| font-size: 12.5px; | ||
| .lens-card-body > :first-child { margin-top: 0; } | ||
| .lens-card-body > :last-child { margin-bottom: 0; } | ||
| .lens-card-body h1, .lens-card-body h2, .lens-card-body h3, .lens-card-body h4 { | ||
| font-size: 12px; | ||
| color: var(--text); | ||
| margin: 0.9em 0 0.4em; | ||
| margin: 0.8em 0 0.3em; | ||
| font-weight: 600; | ||
| text-transform: none; | ||
| letter-spacing: 0; | ||
| } | ||
| .wb-card-body h1 { font-size: 13.5px; } | ||
| .wb-card-body p { margin: 0 0 0.7em; } | ||
| .wb-card-body p:last-child { margin-bottom: 0; } | ||
| .wb-card-body ul, .wb-card-body ol { padding-left: 1.3em; margin: 0 0 0.7em; } | ||
| .wb-card-body li { margin: 0.2em 0; } | ||
| .wb-card-body code { | ||
| .lens-card-body p { margin: 0 0 0.5em; } | ||
| .lens-card-body p:last-child { margin-bottom: 0; } | ||
| .lens-card-body ul, .lens-card-body ol { padding-left: 1.2em; margin: 0 0 0.5em; } | ||
| .lens-card-body li { margin: 0.15em 0; } | ||
| .lens-card-body code { | ||
| background: var(--bg); | ||
| padding: 0 4px; | ||
| padding: 0 3px; | ||
| border-radius: 3px; | ||
@@ -1059,60 +1005,18 @@ font-family: "SF Mono", Menlo, monospace; | ||
| } | ||
| .wb-card-body pre { | ||
| .lens-card-body pre { | ||
| background: var(--bg); | ||
| border: 1px solid var(--border); | ||
| border-radius: 4px; | ||
| padding: 8px 10px; | ||
| font-size: 11px; | ||
| overflow-x: auto; | ||
| margin: 0.6em 0; | ||
| padding: 6px 8px; | ||
| font-size: 10.5px; | ||
| overflow: hidden; | ||
| margin: 0.5em 0; | ||
| } | ||
| .wb-card-body pre code { background: none; padding: 0; } | ||
| .wb-card-body blockquote { | ||
| margin: 0.6em 0; | ||
| padding: 2px 0 2px 10px; | ||
| .lens-card-body blockquote { | ||
| margin: 0.5em 0; | ||
| padding: 0 0 0 8px; | ||
| border-left: 2px solid var(--border); | ||
| color: var(--text-faint); | ||
| } | ||
| .wb-card-body a.inline-ref { | ||
| color: var(--accent); | ||
| background: rgba(88, 166, 255, 0.1); | ||
| padding: 0 3px; | ||
| border-radius: 2px; | ||
| text-decoration: none; | ||
| cursor: pointer; | ||
| } | ||
| .wb-card-body a.inline-ref:hover { background: rgba(88, 166, 255, 0.22); } | ||
| /* Whiteboard toolbar (bottom-right) */ | ||
| .wb-toolbar { | ||
| position: absolute; | ||
| right: 16px; | ||
| bottom: 16px; | ||
| z-index: 5; | ||
| display: flex; | ||
| gap: 2px; | ||
| padding: 4px; | ||
| background: rgba(22, 27, 34, 0.9); | ||
| border: 1px solid var(--border); | ||
| border-radius: 8px; | ||
| backdrop-filter: blur(6px); | ||
| } | ||
| .wb-toolbar button { | ||
| background: transparent; | ||
| border: none; | ||
| color: var(--text-dim); | ||
| width: 28px; | ||
| height: 28px; | ||
| border-radius: 4px; | ||
| cursor: pointer; | ||
| font-size: 14px; | ||
| line-height: 1; | ||
| padding: 0; | ||
| } | ||
| .wb-toolbar button:hover { | ||
| background: var(--bg); | ||
| color: var(--text); | ||
| } | ||
| /* Edge tooltip — floats above everything on hover */ | ||
@@ -1119,0 +1023,0 @@ .edge-tooltip { |
@@ -8,2 +8,5 @@ <!DOCTYPE html> | ||
| <link rel="stylesheet" href="/app.css" /> | ||
| <!-- React Flow stylesheet — only used by the ?engine=rf renderer but always | ||
| loaded since it's a small static file. --> | ||
| <link rel="stylesheet" href="/xyflow.css" /> | ||
| </head> | ||
@@ -10,0 +13,0 @@ <body> |
+6
-1
| { | ||
| "name": "lens-note", | ||
| "version": "1.32.0", | ||
| "version": "1.34.0", | ||
| "description": "Knowledge graph CLI for humans and agents. Like Git for knowledge.", | ||
@@ -28,3 +28,6 @@ "type": "module", | ||
| "@types/js-yaml": "^4.0.9", | ||
| "@types/react": "^18.3.28", | ||
| "@types/react-dom": "^18.3.7", | ||
| "@types/turndown": "^5.0.6", | ||
| "@xyflow/react": "^12.10.2", | ||
| "cytoscape": "^3.33.2", | ||
@@ -35,2 +38,4 @@ "cytoscape-fcose": "^2.2.0", | ||
| "linkedom": "^0.18.12", | ||
| "react": "^18.3.1", | ||
| "react-dom": "^18.3.1", | ||
| "tsup": "^8.5.1", | ||
@@ -37,0 +42,0 @@ "tsx": "^4.0.0", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
3269389
12.06%6
20%62390
4%18
38.46%6
20%10
66.67%