@3plate/graph-core 0.1.10 → 0.1.14
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/index.cjs +416 -11
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +89 -90
- package/dist/index.d.ts +89 -90
- package/dist/index.js +416 -11
- package/dist/index.js.map +1 -0
- package/package.json +8 -5
package/dist/index.cjs
CHANGED
|
@@ -2833,8 +2833,10 @@ var EditEdgeModal = class _EditEdgeModal extends Modal {
|
|
|
2833
2833
|
}
|
|
2834
2834
|
};
|
|
2835
2835
|
|
|
2836
|
+
// src/canvas/styles.css
|
|
2837
|
+
var styles_default = "/* ==================== Theme Variables ==================== */\n\n/* Light theme (default) */\n:root {\n --g3p-bg: #fafafa;\n --g3p-bg-node: #ffffff;\n --g3p-bg-secondary: #f8fafc;\n --g3p-border: #e2e8f0;\n --g3p-border-hover: #cbd5e1;\n --g3p-border-selected: #3b82f6;\n --g3p-text: #1e293b;\n --g3p-text-muted: #475569;\n --g3p-text-subtle: #64748b;\n --g3p-edge-color: #64748b;\n --g3p-port-bg: #e2e8f0;\n --g3p-port-bg-hover: #cbd5e1;\n --g3p-shadow: rgba(0, 0, 0, 0.15);\n}\n\n/* Dark theme (auto via prefers-color-scheme) */\n@media (prefers-color-scheme: dark) {\n :root {\n --g3p-bg: #1a1a1a;\n --g3p-bg-node: #333333;\n --g3p-bg-secondary: #2a2a2a;\n --g3p-border: #4a4a4a;\n --g3p-border-hover: #5a5a5a;\n --g3p-border-selected: #60a5fa;\n --g3p-text: #f0f0f0;\n --g3p-text-muted: #c0c0c0;\n --g3p-text-subtle: #909090;\n --g3p-edge-color: #b0b0b0;\n --g3p-port-bg: #444444;\n --g3p-port-bg-hover: #555555;\n --g3p-shadow: rgba(0, 0, 0, 0.5);\n }\n}\n\n/* Explicit light mode override */\n.g3p-light {\n --g3p-bg: #fafafa;\n --g3p-bg-node: #ffffff;\n --g3p-bg-secondary: #f8fafc;\n --g3p-border: #e2e8f0;\n --g3p-border-hover: #cbd5e1;\n --g3p-border-selected: #3b82f6;\n --g3p-text: #1e293b;\n --g3p-text-muted: #475569;\n --g3p-text-subtle: #64748b;\n --g3p-edge-color: #64748b;\n --g3p-port-bg: #e2e8f0;\n --g3p-port-bg-hover: #cbd5e1;\n --g3p-shadow: rgba(0, 0, 0, 0.15);\n}\n\n/* Explicit dark mode override */\n.g3p-dark {\n --g3p-bg: #1a1a1a;\n --g3p-bg-node: #333333;\n --g3p-bg-secondary: #2a2a2a;\n --g3p-border: #4a4a4a;\n --g3p-border-hover: #5a5a5a;\n --g3p-border-selected: #60a5fa;\n --g3p-text: #f0f0f0;\n --g3p-text-muted: #c0c0c0;\n --g3p-text-subtle: #909090;\n --g3p-edge-color: #b0b0b0;\n --g3p-port-bg: #444444;\n --g3p-port-bg-hover: #555555;\n --g3p-shadow: rgba(0, 0, 0, 0.5);\n}\n\n/* ==================== Canvas ==================== */\n\n.g3p-canvas-container {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n\n.g3p-canvas-root {\n display: block;\n width: 100%;\n height: 100%;\n user-select: none;\n background: var(--g3p-bg);\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n}\n\n/* ==================== Zoom Controls ==================== */\n\n.g3p-zoom-controls {\n position: absolute;\n bottom: 1rem;\n right: 1rem;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n background: var(--g3p-bg-node);\n border-radius: 8px;\n padding: 0.5rem;\n box-shadow: 0 2px 8px var(--g3p-shadow);\n z-index: 10;\n}\n\n.g3p-zoom-btn {\n width: 36px;\n height: 36px;\n border: 1px solid var(--g3p-border);\n background: var(--g3p-bg-node);\n border-radius: 6px;\n font-size: 1.25rem;\n font-weight: 600;\n color: var(--g3p-text-muted);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s;\n}\n\n.g3p-zoom-btn:hover {\n background: var(--g3p-bg-secondary);\n border-color: var(--g3p-border-hover);\n color: var(--g3p-text);\n}\n\n.g3p-zoom-btn:active {\n transform: scale(0.95);\n}\n\n.g3p-zoom-reset {\n font-size: 1.1rem;\n}\n\n.g3p-zoom-level {\n text-align: center;\n font-size: 0.75rem;\n font-weight: 600;\n color: var(--g3p-text-subtle);\n padding: 0.25rem 0;\n}\n\n/* ==================== Nodes ==================== */\n\n/* Default node content styles */\n.g3p-node-default {\n padding: 8px 12px;\n font: 14px/1.4 system-ui, sans-serif;\n color: var(--g3p-text);\n}\n\n.g3p-node-title {\n font-weight: 500;\n}\n\n.g3p-node-detail {\n font-size: 12px;\n color: var(--g3p-text-muted);\n margin-top: 2px;\n}\n\n.g3p-node-container {\n transition: opacity 0.2s ease;\n}\n\n.g3p-node-border {\n background: var(--g3p-bg-node);\n border: 1px solid var(--g3p-border);\n border-radius: 8px;\n overflow: hidden;\n transition: all 0.15s ease;\n}\n\n.g3p-node-border:hover {\n border-color: var(--g3p-border-hover);\n}\n\n.g3p-node-border.selected {\n outline: 2px solid var(--g3p-border-selected);\n}\n\n.g3p-node-content-wrapper {\n pointer-events: none;\n}\n\n.g3p-node-content {\n pointer-events: auto;\n box-sizing: border-box;\n}\n\n.g3p-node-content>div {\n width: 100%;\n height: 100%;\n}\n\n/* Dummy node styles - these remain SVG since dummies are ellipses */\n.g3p-node-dummy .g3p-node-background {\n fill: var(--g3p-bg-secondary);\n opacity: 0.8;\n}\n\n.g3p-node-dummy {\n stroke: var(--g3p-border-hover);\n stroke-dasharray: 3, 3;\n cursor: default;\n}\n\n/* Port container styles */\n.g3p-node-ports {\n display: flex;\n gap: 4px;\n}\n\n.g3p-node-ports-row {\n flex-direction: row;\n justify-content: center;\n padding-left: 8px;\n padding-right: 8px;\n}\n\n.g3p-node-ports-col {\n flex-direction: column;\n justify-content: center;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n/* Port styles */\n.g3p-node-port {\n background: var(--g3p-port-bg);\n border: 1px solid var(--g3p-border-hover);\n padding: 2px 6px;\n font-size: 0.5em;\n color: var(--g3p-text-muted);\n white-space: nowrap;\n transition: all 0.15s ease;\n}\n\n.g3p-node-port:hover {\n background: var(--g3p-port-bg-hover);\n border-color: var(--g3p-text-subtle);\n}\n\n.g3p-node-port-rotated-left {\n writing-mode: vertical-lr;\n}\n\n.g3p-node-port-rotated-right {\n writing-mode: vertical-rl;\n}\n\n/* Outside ports: rounded corners away from the node rectangle, no border on touching side */\n.g3p-node-port-out-top {\n border-radius: 4px 4px 0 0;\n border-bottom: none;\n}\n\n.g3p-node-port-out-bottom {\n border-radius: 0 0 4px 4px;\n border-top: none;\n}\n\n.g3p-node-port-out-left {\n border-radius: 4px 0 0 4px;\n border-right: none;\n}\n\n.g3p-node-port-out-right {\n border-radius: 0 4px 4px 0;\n border-left: none;\n}\n\n/* Inside ports: rounded corners toward the content, no border on outer edge */\n.g3p-node-port-in-top {\n border-radius: 0 0 4px 4px;\n border-top: none;\n}\n\n.g3p-node-port-in-bottom {\n border-radius: 4px 4px 0 0;\n border-bottom: none;\n}\n\n.g3p-node-port-in-left {\n border-radius: 0 4px 4px 0;\n border-left: none;\n}\n\n.g3p-node-port-in-right {\n border-radius: 4px 0 0 4px;\n border-right: none;\n}\n\n/* Port wrapper */\n.g3p-node-with-ports {\n display: flex;\n}\n\n.g3p-node-with-ports-v {\n flex-direction: column;\n}\n\n.g3p-node-with-ports-h {\n flex-direction: row;\n}\n\n/* ==================== Edges (Segments) ==================== */\n\n.g3p-seg-container {\n transition: opacity 0.2s ease;\n}\n\n.g3p-seg-line {\n stroke: var(--g3p-edge-color);\n stroke-width: 1;\n transition: stroke 0.2s ease, stroke-width 0.2s ease;\n}\n\n.g3p-seg-marker {\n fill: var(--g3p-edge-color);\n}\n\n.g3p-seg-line.hovered {\n stroke-width: 2;\n opacity: 1;\n}\n\n.g3p-seg-line.selected {\n stroke: var(--g3p-border-selected);\n stroke-width: 2;\n}\n\n.g3p-seg-hitbox {\n cursor: pointer;\n}\n\n/* ==================== Markers ==================== */\n\n.g3p-marker {\n fill: context-stroke;\n stroke: none;\n}\n\n.g3p-marker-bar {\n fill: none;\n stroke: context-stroke;\n stroke-width: 2;\n}\n\n.g3p-marker.hovered {\n fill: var(--g3p-text-muted);\n}\n\n.g3p-marker.selected {\n fill: var(--g3p-border-selected);\n}\n\n.g3p-marker-bar.hovered {\n stroke: var(--g3p-text-muted);\n}\n\n.g3p-marker-bar.selected {\n stroke: var(--g3p-border-selected);\n}\n\n/* ==================== New Edge (Edit Mode) ==================== */\n\n.g3p-new-edge-container {\n pointer-events: none;\n}\n\n.g3p-new-edge-origin {\n fill: var(--g3p-edge-color, #64748b);\n stroke: none;\n}\n\n.g3p-new-edge-line {\n stroke: var(--g3p-edge-color, #64748b);\n stroke-width: 2;\n stroke-dasharray: 6 4;\n stroke-linecap: round;\n fill: none;\n animation: g3p-dash-animation 0.5s linear infinite;\n}\n\n.g3p-new-edge-end {\n fill: var(--g3p-edge-color, #64748b);\n stroke: white;\n stroke-width: 1.5;\n}\n\n@keyframes g3p-dash-animation {\n to {\n stroke-dashoffset: -10;\n }\n}\n\n/* ==================== Edit Mode Hover States ==================== */\n\n.g3p-node-container.g3p-drop-target .g3p-node-border {\n background: var(--g3p-border-selected);\n color: white;\n}\n\n.g3p-node-port.g3p-drop-target {\n background: var(--g3p-border-selected);\n color: white;\n}\n\n/* ==================== Modals ==================== */\n\n.g3p-modal-overlay {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n z-index: 1000;\n}\n\n.g3p-modal-dialog {\n background: var(--g3p-bg-node);\n border: 1px solid var(--g3p-border);\n border-radius: 8px;\n box-shadow: 0 4px 20px var(--g3p-shadow);\n min-width: 280px;\n max-width: 400px;\n}\n\n.g3p-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n border-bottom: 1px solid var(--g3p-border);\n}\n\n.g3p-modal-title {\n font-weight: 600;\n font-size: 14px;\n color: var(--g3p-text);\n}\n\n.g3p-modal-close {\n background: none;\n border: none;\n font-size: 20px;\n color: var(--g3p-text-muted);\n cursor: pointer;\n padding: 0;\n line-height: 1;\n}\n\n.g3p-modal-close:hover {\n color: var(--g3p-text);\n}\n\n.g3p-modal-body {\n padding: 16px;\n}\n\n.g3p-modal-field {\n margin-bottom: 12px;\n}\n\n.g3p-modal-field:last-child {\n margin-bottom: 0;\n}\n\n.g3p-modal-label {\n display: block;\n font-size: 12px;\n font-weight: 500;\n color: var(--g3p-text-muted);\n margin-bottom: 4px;\n}\n\n.g3p-modal-input,\n.g3p-modal-select {\n width: 100%;\n padding: 8px 10px;\n font-size: 13px;\n border: 1px solid var(--g3p-border);\n border-radius: 4px;\n background: var(--g3p-bg);\n color: var(--g3p-text);\n box-sizing: border-box;\n}\n\n.g3p-modal-input:focus,\n.g3p-modal-select:focus {\n outline: none;\n border-color: var(--g3p-border-selected);\n}\n\n.g3p-modal-footer {\n padding: 12px 16px;\n border-top: 1px solid var(--g3p-border);\n}\n\n.g3p-modal-buttons {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.g3p-modal-spacer {\n flex: 1;\n}\n\n.g3p-modal-btn {\n padding: 6px 12px;\n font-size: 13px;\n font-weight: 500;\n border-radius: 4px;\n cursor: pointer;\n border: 1px solid transparent;\n transition: all 0.15s ease;\n}\n\n.g3p-modal-btn-primary {\n background: var(--g3p-border-selected);\n color: white;\n}\n\n.g3p-modal-btn-primary:hover {\n filter: brightness(1.1);\n}\n\n.g3p-modal-btn-secondary {\n background: var(--g3p-bg);\n border-color: var(--g3p-border);\n color: var(--g3p-text);\n}\n\n.g3p-modal-btn-secondary:hover {\n background: var(--g3p-bg-secondary);\n}\n\n.g3p-modal-btn-danger {\n background: #ef4444;\n color: white;\n}\n\n.g3p-modal-btn-danger:hover {\n background: #dc2626;\n}";
|
|
2838
|
+
|
|
2836
2839
|
// src/canvas/canvas.tsx
|
|
2837
|
-
var import_styles = __toESM(require("./styles.css?raw"), 1);
|
|
2838
2840
|
var import_jsx_runtime6 = require("jsx-dom/jsx-runtime");
|
|
2839
2841
|
var log10 = logger("canvas");
|
|
2840
2842
|
var Canvas = class {
|
|
@@ -3079,7 +3081,7 @@ var Canvas = class {
|
|
|
3079
3081
|
if (!document.getElementById("g3p-styles")) {
|
|
3080
3082
|
const baseStyleEl = document.createElement("style");
|
|
3081
3083
|
baseStyleEl.id = "g3p-styles";
|
|
3082
|
-
baseStyleEl.textContent =
|
|
3084
|
+
baseStyleEl.textContent = styles_default;
|
|
3083
3085
|
document.head.appendChild(baseStyleEl);
|
|
3084
3086
|
}
|
|
3085
3087
|
const dynamicStyles = this.generateDynamicStyles();
|
|
@@ -3546,7 +3548,6 @@ function renderNode(node, props) {
|
|
|
3546
3548
|
if (typeof node == "string") node = { id: node };
|
|
3547
3549
|
const title = node?.title ?? props?.title ?? node?.label ?? node?.name ?? node?.text ?? props?.text ?? node?.id ?? "?";
|
|
3548
3550
|
const detail = node?.detail ?? node?.description ?? node?.subtitle;
|
|
3549
|
-
console.log(`renderNode: ${node.id} ${title} ${detail}`);
|
|
3550
3551
|
return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "g3p-node-default", children: [
|
|
3551
3552
|
/* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "g3p-node-title", children: title }),
|
|
3552
3553
|
detail && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "g3p-node-detail", children: detail })
|
|
@@ -3678,7 +3679,7 @@ var Ingest = class {
|
|
|
3678
3679
|
* Apply an incoming ingest message to the API.
|
|
3679
3680
|
* - snapshot: rebuild state from nodes/edges (clears prior history)
|
|
3680
3681
|
* - update: apply incremental update
|
|
3681
|
-
* - history: initialize from a set of
|
|
3682
|
+
* - history: initialize from a set of updates (clears prior history)
|
|
3682
3683
|
*/
|
|
3683
3684
|
async apply(msg) {
|
|
3684
3685
|
switch (msg.type) {
|
|
@@ -3699,7 +3700,7 @@ var Ingest = class {
|
|
|
3699
3700
|
break;
|
|
3700
3701
|
}
|
|
3701
3702
|
case "history": {
|
|
3702
|
-
await this.api.replaceHistory(msg.
|
|
3703
|
+
await this.api.replaceHistory(msg.history);
|
|
3703
3704
|
break;
|
|
3704
3705
|
}
|
|
3705
3706
|
}
|
|
@@ -4073,9 +4074,9 @@ var API = class {
|
|
|
4073
4074
|
this.canvas.editMode.editable = editable;
|
|
4074
4075
|
}
|
|
4075
4076
|
/** Replace entire history (clears prior) */
|
|
4076
|
-
async replaceHistory(
|
|
4077
|
+
async replaceHistory(history) {
|
|
4077
4078
|
this.reset();
|
|
4078
|
-
this.history =
|
|
4079
|
+
this.history = history;
|
|
4079
4080
|
await this.applyHistory();
|
|
4080
4081
|
}
|
|
4081
4082
|
/** Rebuild from snapshot (nodes/edges) */
|
|
@@ -4542,8 +4543,8 @@ var API = class {
|
|
|
4542
4543
|
}
|
|
4543
4544
|
} else if (prev.history && isHistoryPrefix(prev.history, props.history)) {
|
|
4544
4545
|
const prevLength = prev.history.length;
|
|
4545
|
-
const
|
|
4546
|
-
for (const frame of
|
|
4546
|
+
const newUpdates = props.history.slice(prevLength);
|
|
4547
|
+
for (const frame of newUpdates) {
|
|
4547
4548
|
this.update((u) => {
|
|
4548
4549
|
if (frame.addNodes) u.addNodes(...frame.addNodes);
|
|
4549
4550
|
if (frame.removeNodes) u.deleteNodes(...frame.removeNodes);
|
|
@@ -4630,8 +4631,411 @@ function shallowEqualUpdate(a, b) {
|
|
|
4630
4631
|
return true;
|
|
4631
4632
|
}
|
|
4632
4633
|
|
|
4634
|
+
// src/playground/styles.css
|
|
4635
|
+
var styles_default2 = `.playground {
|
|
4636
|
+
display: flex;
|
|
4637
|
+
height: calc(100vh - 60px);
|
|
4638
|
+
}
|
|
4639
|
+
|
|
4640
|
+
.sidebar {
|
|
4641
|
+
width: 280px;
|
|
4642
|
+
background: var(--color-bg);
|
|
4643
|
+
border-right: 1px solid var(--color-border);
|
|
4644
|
+
padding: 1.5rem;
|
|
4645
|
+
overflow-y: auto;
|
|
4646
|
+
}
|
|
4647
|
+
|
|
4648
|
+
.sidebar h2 {
|
|
4649
|
+
font-size: 0.875rem;
|
|
4650
|
+
text-transform: uppercase;
|
|
4651
|
+
letter-spacing: 0.05em;
|
|
4652
|
+
color: var(--color-text-muted);
|
|
4653
|
+
margin-bottom: 0.75rem;
|
|
4654
|
+
margin-top: 1.5rem;
|
|
4655
|
+
}
|
|
4656
|
+
|
|
4657
|
+
.sidebar h2:first-child {
|
|
4658
|
+
margin-top: 0;
|
|
4659
|
+
}
|
|
4660
|
+
|
|
4661
|
+
.example-list {
|
|
4662
|
+
display: flex;
|
|
4663
|
+
flex-direction: column;
|
|
4664
|
+
gap: 0.5rem;
|
|
4665
|
+
}
|
|
4666
|
+
|
|
4667
|
+
.example-btn {
|
|
4668
|
+
padding: 0.75rem 1rem;
|
|
4669
|
+
background: var(--color-bg-secondary);
|
|
4670
|
+
border: 1px solid var(--color-border);
|
|
4671
|
+
border-radius: 0.5rem;
|
|
4672
|
+
text-align: left;
|
|
4673
|
+
cursor: pointer;
|
|
4674
|
+
font-size: 0.875rem;
|
|
4675
|
+
color: var(--color-text);
|
|
4676
|
+
transition: all 0.15s;
|
|
4677
|
+
}
|
|
4678
|
+
|
|
4679
|
+
.example-btn:hover {
|
|
4680
|
+
background: var(--color-border);
|
|
4681
|
+
}
|
|
4682
|
+
|
|
4683
|
+
.example-btn.active {
|
|
4684
|
+
background: var(--color-primary);
|
|
4685
|
+
color: white;
|
|
4686
|
+
border-color: var(--color-primary);
|
|
4687
|
+
}
|
|
4688
|
+
|
|
4689
|
+
.options {
|
|
4690
|
+
display: flex;
|
|
4691
|
+
flex-direction: column;
|
|
4692
|
+
gap: 1rem;
|
|
4693
|
+
}
|
|
4694
|
+
|
|
4695
|
+
.option-group {
|
|
4696
|
+
display: flex;
|
|
4697
|
+
flex-direction: column;
|
|
4698
|
+
gap: 0.25rem;
|
|
4699
|
+
}
|
|
4700
|
+
|
|
4701
|
+
.option-group label {
|
|
4702
|
+
font-size: 0.875rem;
|
|
4703
|
+
color: var(--color-text-muted);
|
|
4704
|
+
}
|
|
4705
|
+
|
|
4706
|
+
.option-group select {
|
|
4707
|
+
padding: 0.5rem;
|
|
4708
|
+
border: 1px solid var(--color-border);
|
|
4709
|
+
border-radius: 0.25rem;
|
|
4710
|
+
font-size: 0.875rem;
|
|
4711
|
+
}
|
|
4712
|
+
|
|
4713
|
+
.option-group input[type="checkbox"] {
|
|
4714
|
+
margin-right: 0.5rem;
|
|
4715
|
+
}
|
|
4716
|
+
|
|
4717
|
+
.graph-area {
|
|
4718
|
+
flex: 1;
|
|
4719
|
+
padding: 1.5rem;
|
|
4720
|
+
overflow: hidden;
|
|
4721
|
+
display: flex;
|
|
4722
|
+
flex-direction: column;
|
|
4723
|
+
gap: 0.75rem;
|
|
4724
|
+
}
|
|
4725
|
+
|
|
4726
|
+
.graph-toolbar {
|
|
4727
|
+
display: flex;
|
|
4728
|
+
align-items: center;
|
|
4729
|
+
gap: 1rem;
|
|
4730
|
+
}
|
|
4731
|
+
|
|
4732
|
+
.nav-controls {
|
|
4733
|
+
display: flex;
|
|
4734
|
+
align-items: center;
|
|
4735
|
+
gap: 0.25rem;
|
|
4736
|
+
}
|
|
4737
|
+
|
|
4738
|
+
.nav-btn {
|
|
4739
|
+
padding: 0.5rem 0.75rem;
|
|
4740
|
+
background: var(--color-bg-secondary);
|
|
4741
|
+
border: 1px solid var(--color-border);
|
|
4742
|
+
border-radius: 0.25rem;
|
|
4743
|
+
cursor: pointer;
|
|
4744
|
+
font-size: 0.875rem;
|
|
4745
|
+
color: var(--color-text);
|
|
4746
|
+
transition: all 0.15s;
|
|
4747
|
+
height: 2.25rem;
|
|
4748
|
+
display: inline-flex;
|
|
4749
|
+
align-items: center;
|
|
4750
|
+
justify-content: center;
|
|
4751
|
+
box-sizing: border-box;
|
|
4752
|
+
}
|
|
4753
|
+
|
|
4754
|
+
.nav-btn:hover:not(:disabled) {
|
|
4755
|
+
background: var(--color-border);
|
|
4756
|
+
}
|
|
4757
|
+
|
|
4758
|
+
.nav-btn:disabled {
|
|
4759
|
+
opacity: 0.4;
|
|
4760
|
+
cursor: not-allowed;
|
|
4761
|
+
}
|
|
4762
|
+
|
|
4763
|
+
/* Prominent edit toggle */
|
|
4764
|
+
#edit-toggle {
|
|
4765
|
+
background: var(--color-primary);
|
|
4766
|
+
border-color: var(--color-primary);
|
|
4767
|
+
color: #fff;
|
|
4768
|
+
font-weight: 600;
|
|
4769
|
+
}
|
|
4770
|
+
|
|
4771
|
+
/* Source Icon Button */
|
|
4772
|
+
.source-icon-btn {
|
|
4773
|
+
font-size: 1.1rem;
|
|
4774
|
+
padding: 0.5rem;
|
|
4775
|
+
min-width: 2.5rem;
|
|
4776
|
+
position: relative;
|
|
4777
|
+
height: 2.25rem;
|
|
4778
|
+
}
|
|
4779
|
+
|
|
4780
|
+
.source-icon-btn::after {
|
|
4781
|
+
content: '';
|
|
4782
|
+
position: absolute;
|
|
4783
|
+
bottom: 2px;
|
|
4784
|
+
right: 2px;
|
|
4785
|
+
width: 8px;
|
|
4786
|
+
height: 8px;
|
|
4787
|
+
border-radius: 50%;
|
|
4788
|
+
background: var(--color-border);
|
|
4789
|
+
border: 1px solid var(--color-bg);
|
|
4790
|
+
}
|
|
4791
|
+
|
|
4792
|
+
.source-icon-btn.active::after {
|
|
4793
|
+
background: rgb(34, 197, 94);
|
|
4794
|
+
box-shadow: 0 0 4px rgba(34, 197, 94, 0.5);
|
|
4795
|
+
}
|
|
4796
|
+
|
|
4797
|
+
.source-icon-btn.connecting::after {
|
|
4798
|
+
background: rgb(251, 191, 36);
|
|
4799
|
+
box-shadow: 0 0 4px rgba(251, 191, 36, 0.5);
|
|
4800
|
+
animation: pulse-dot 1.5s ease-in-out infinite;
|
|
4801
|
+
}
|
|
4802
|
+
|
|
4803
|
+
.source-icon-btn.error::after {
|
|
4804
|
+
background: rgb(239, 68, 68);
|
|
4805
|
+
box-shadow: 0 0 4px rgba(239, 68, 68, 0.5);
|
|
4806
|
+
}
|
|
4807
|
+
|
|
4808
|
+
.source-icon-btn.active {
|
|
4809
|
+
background: var(--color-primary);
|
|
4810
|
+
border-color: var(--color-primary);
|
|
4811
|
+
color: #fff;
|
|
4812
|
+
}
|
|
4813
|
+
|
|
4814
|
+
.source-icon-btn.connecting {
|
|
4815
|
+
background: var(--color-primary);
|
|
4816
|
+
border-color: var(--color-primary);
|
|
4817
|
+
color: #fff;
|
|
4818
|
+
opacity: 0.7;
|
|
4819
|
+
animation: pulse 1.5s ease-in-out infinite;
|
|
4820
|
+
}
|
|
4821
|
+
|
|
4822
|
+
.source-icon-btn.error {
|
|
4823
|
+
border-color: rgb(239, 68, 68);
|
|
4824
|
+
}
|
|
4825
|
+
|
|
4826
|
+
@keyframes pulse-dot {
|
|
4827
|
+
0%, 100% { opacity: 1; transform: scale(1); }
|
|
4828
|
+
50% { opacity: 0.5; transform: scale(0.8); }
|
|
4829
|
+
}
|
|
4830
|
+
|
|
4831
|
+
@keyframes pulse {
|
|
4832
|
+
0%, 100% { opacity: 0.7; }
|
|
4833
|
+
50% { opacity: 1; }
|
|
4834
|
+
}
|
|
4835
|
+
|
|
4836
|
+
.graph-container {
|
|
4837
|
+
flex: 1;
|
|
4838
|
+
background: var(--color-bg);
|
|
4839
|
+
border-radius: 0.75rem;
|
|
4840
|
+
box-shadow: var(--shadow-md);
|
|
4841
|
+
overflow: hidden;
|
|
4842
|
+
}
|
|
4843
|
+
|
|
4844
|
+
/* Modal styles (global) */
|
|
4845
|
+
.modal-overlay {
|
|
4846
|
+
position: fixed;
|
|
4847
|
+
inset: 0;
|
|
4848
|
+
background: rgba(0, 0, 0, 0.35);
|
|
4849
|
+
display: none;
|
|
4850
|
+
align-items: center;
|
|
4851
|
+
justify-content: center;
|
|
4852
|
+
z-index: 1000;
|
|
4853
|
+
}
|
|
4854
|
+
|
|
4855
|
+
.modal {
|
|
4856
|
+
width: min(680px, calc(100vw - 2rem));
|
|
4857
|
+
background: var(--color-bg);
|
|
4858
|
+
color: var(--color-text);
|
|
4859
|
+
border: 1px solid var(--color-border);
|
|
4860
|
+
border-radius: 0.75rem;
|
|
4861
|
+
box-shadow: var(--shadow-lg);
|
|
4862
|
+
overflow: hidden;
|
|
4863
|
+
}
|
|
4864
|
+
|
|
4865
|
+
.modal-header {
|
|
4866
|
+
display: flex;
|
|
4867
|
+
align-items: center;
|
|
4868
|
+
justify-content: space-between;
|
|
4869
|
+
padding: 0.75rem 1rem;
|
|
4870
|
+
border-bottom: 1px solid var(--color-border);
|
|
4871
|
+
background: var(--color-bg-secondary);
|
|
4872
|
+
}
|
|
4873
|
+
|
|
4874
|
+
.modal-header h3 {
|
|
4875
|
+
font-size: 1rem;
|
|
4876
|
+
font-weight: 600;
|
|
4877
|
+
}
|
|
4878
|
+
|
|
4879
|
+
.modal-close {
|
|
4880
|
+
background: transparent;
|
|
4881
|
+
border: none;
|
|
4882
|
+
color: var(--color-text);
|
|
4883
|
+
font-size: 1.25rem;
|
|
4884
|
+
cursor: pointer;
|
|
4885
|
+
}
|
|
4886
|
+
|
|
4887
|
+
.modal-body {
|
|
4888
|
+
padding: 1rem;
|
|
4889
|
+
line-height: 1.6;
|
|
4890
|
+
}
|
|
4891
|
+
|
|
4892
|
+
.modal-body ul {
|
|
4893
|
+
margin: 0.5rem 0 0 1.25rem;
|
|
4894
|
+
}
|
|
4895
|
+
|
|
4896
|
+
.modal-body .form-group {
|
|
4897
|
+
margin-bottom: 1rem;
|
|
4898
|
+
}
|
|
4899
|
+
|
|
4900
|
+
.modal-body label {
|
|
4901
|
+
display: block;
|
|
4902
|
+
font-size: 0.875rem;
|
|
4903
|
+
color: var(--color-text-muted);
|
|
4904
|
+
margin-bottom: 0.5rem;
|
|
4905
|
+
}
|
|
4906
|
+
|
|
4907
|
+
.modal-body input[type="text"] {
|
|
4908
|
+
width: 100%;
|
|
4909
|
+
padding: 0.5rem;
|
|
4910
|
+
border: 1px solid var(--color-border);
|
|
4911
|
+
border-radius: 0.25rem;
|
|
4912
|
+
font-size: 0.875rem;
|
|
4913
|
+
background: var(--color-bg);
|
|
4914
|
+
color: var(--color-text);
|
|
4915
|
+
}
|
|
4916
|
+
|
|
4917
|
+
.modal-body .button-group {
|
|
4918
|
+
display: flex;
|
|
4919
|
+
gap: 0.5rem;
|
|
4920
|
+
margin-top: 1rem;
|
|
4921
|
+
}
|
|
4922
|
+
|
|
4923
|
+
.modal-body .button-group button {
|
|
4924
|
+
flex: 1;
|
|
4925
|
+
padding: 0.5rem 1rem;
|
|
4926
|
+
border: 1px solid var(--color-border);
|
|
4927
|
+
border-radius: 0.25rem;
|
|
4928
|
+
background: var(--color-bg-secondary);
|
|
4929
|
+
color: var(--color-text);
|
|
4930
|
+
cursor: pointer;
|
|
4931
|
+
font-size: 0.875rem;
|
|
4932
|
+
transition: all 0.15s;
|
|
4933
|
+
}
|
|
4934
|
+
|
|
4935
|
+
.modal-body .button-group button:hover:not(:disabled) {
|
|
4936
|
+
background: var(--color-border);
|
|
4937
|
+
}
|
|
4938
|
+
|
|
4939
|
+
.modal-body .button-group button:disabled {
|
|
4940
|
+
opacity: 0.5;
|
|
4941
|
+
cursor: not-allowed;
|
|
4942
|
+
}
|
|
4943
|
+
|
|
4944
|
+
.modal-body .button-group button.primary {
|
|
4945
|
+
background: var(--color-primary);
|
|
4946
|
+
border-color: var(--color-primary);
|
|
4947
|
+
color: #fff;
|
|
4948
|
+
}
|
|
4949
|
+
|
|
4950
|
+
.modal-body .button-group button.primary:hover:not(:disabled) {
|
|
4951
|
+
background: var(--color-primary);
|
|
4952
|
+
opacity: 0.9;
|
|
4953
|
+
}
|
|
4954
|
+
|
|
4955
|
+
.modal-body .status-message {
|
|
4956
|
+
margin-top: 1rem;
|
|
4957
|
+
padding: 0.75rem;
|
|
4958
|
+
border-radius: 0.25rem;
|
|
4959
|
+
font-size: 0.875rem;
|
|
4960
|
+
}
|
|
4961
|
+
|
|
4962
|
+
.modal-body .status-message.info {
|
|
4963
|
+
background: rgba(59, 130, 246, 0.1);
|
|
4964
|
+
color: rgb(59, 130, 246);
|
|
4965
|
+
border: 1px solid rgba(59, 130, 246, 0.2);
|
|
4966
|
+
}
|
|
4967
|
+
|
|
4968
|
+
.modal-body .status-message.error {
|
|
4969
|
+
background: rgba(239, 68, 68, 0.1);
|
|
4970
|
+
color: rgb(239, 68, 68);
|
|
4971
|
+
border: 1px solid rgba(239, 68, 68, 0.2);
|
|
4972
|
+
}
|
|
4973
|
+
|
|
4974
|
+
.modal-body .status-message.success {
|
|
4975
|
+
background: rgba(34, 197, 94, 0.1);
|
|
4976
|
+
color: rgb(34, 197, 94);
|
|
4977
|
+
border: 1px solid rgba(34, 197, 94, 0.2);
|
|
4978
|
+
}
|
|
4979
|
+
|
|
4980
|
+
.modal-body .loading-spinner {
|
|
4981
|
+
display: inline-block;
|
|
4982
|
+
width: 1rem;
|
|
4983
|
+
height: 1rem;
|
|
4984
|
+
border: 2px solid var(--color-border);
|
|
4985
|
+
border-top-color: var(--color-primary);
|
|
4986
|
+
border-radius: 50%;
|
|
4987
|
+
animation: spin 0.6s linear infinite;
|
|
4988
|
+
margin-right: 0.5rem;
|
|
4989
|
+
vertical-align: middle;
|
|
4990
|
+
}
|
|
4991
|
+
|
|
4992
|
+
@keyframes spin {
|
|
4993
|
+
to { transform: rotate(360deg); }
|
|
4994
|
+
}
|
|
4995
|
+
|
|
4996
|
+
.modal-body .source-type-selector {
|
|
4997
|
+
display: flex;
|
|
4998
|
+
gap: 0.5rem;
|
|
4999
|
+
margin-bottom: 1rem;
|
|
5000
|
+
padding: 0.5rem;
|
|
5001
|
+
background: var(--color-bg-secondary);
|
|
5002
|
+
border-radius: 0.25rem;
|
|
5003
|
+
}
|
|
5004
|
+
|
|
5005
|
+
.modal-body .source-type-option {
|
|
5006
|
+
flex: 1;
|
|
5007
|
+
padding: 0.5rem;
|
|
5008
|
+
border: 1px solid var(--color-border);
|
|
5009
|
+
border-radius: 0.25rem;
|
|
5010
|
+
background: var(--color-bg);
|
|
5011
|
+
color: var(--color-text);
|
|
5012
|
+
cursor: pointer;
|
|
5013
|
+
text-align: center;
|
|
5014
|
+
font-size: 0.875rem;
|
|
5015
|
+
transition: all 0.15s;
|
|
5016
|
+
}
|
|
5017
|
+
|
|
5018
|
+
.modal-body .source-type-option:hover {
|
|
5019
|
+
background: var(--color-border);
|
|
5020
|
+
}
|
|
5021
|
+
|
|
5022
|
+
.modal-body .source-type-option.active {
|
|
5023
|
+
background: var(--color-primary);
|
|
5024
|
+
border-color: var(--color-primary);
|
|
5025
|
+
color: #fff;
|
|
5026
|
+
}
|
|
5027
|
+
|
|
5028
|
+
.modal-body .source-controls {
|
|
5029
|
+
display: none;
|
|
5030
|
+
}
|
|
5031
|
+
|
|
5032
|
+
.modal-body .source-controls.active {
|
|
5033
|
+
display: block;
|
|
5034
|
+
}
|
|
5035
|
+
|
|
5036
|
+
`;
|
|
5037
|
+
|
|
4633
5038
|
// src/playground/playground.ts
|
|
4634
|
-
var import_styles2 = __toESM(require("./styles.css?raw"), 1);
|
|
4635
5039
|
var Playground = class {
|
|
4636
5040
|
options;
|
|
4637
5041
|
rootElement;
|
|
@@ -4680,7 +5084,7 @@ var Playground = class {
|
|
|
4680
5084
|
if (!document.getElementById("g3p-playground-styles")) {
|
|
4681
5085
|
const styleEl = document.createElement("style");
|
|
4682
5086
|
styleEl.id = "g3p-playground-styles";
|
|
4683
|
-
styleEl.textContent =
|
|
5087
|
+
styleEl.textContent = styles_default2;
|
|
4684
5088
|
document.head.appendChild(styleEl);
|
|
4685
5089
|
}
|
|
4686
5090
|
}
|
|
@@ -5428,3 +5832,4 @@ var index_default = graph;
|
|
|
5428
5832
|
WebSocketSource,
|
|
5429
5833
|
graph
|
|
5430
5834
|
});
|
|
5835
|
+
//# sourceMappingURL=index.cjs.map
|