@3plate/graph-core 0.1.12 → 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 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 = import_styles.default;
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 })
@@ -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 = import_styles2.default;
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