/* rSocials Campaign Planner — n8n-style flow canvas */ folk-campaign-planner { display: block; height: calc(100vh - 60px); } .cp-root { display: flex; flex-direction: column; height: 100%; font-family: system-ui, -apple-system, sans-serif; color: var(--rs-text-primary, #e2e8f0); } /* ── Toolbar ── */ .cp-toolbar { display: flex; align-items: center; gap: 12px; padding: 10px 20px; min-height: 46px; border-bottom: 1px solid var(--rs-border, #2d2d44); background: var(--rs-bg-surface, #1a1a2e); z-index: 10; } .cp-toolbar__title { font-size: 15px; font-weight: 600; flex: 1; display: flex; align-items: center; gap: 8px; } .cp-demo-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; background: #f59e0b22; color: #f59e0b; font-size: 11px; font-weight: 600; } .cp-toolbar__actions { display: flex; gap: 6px; align-items: center; } .cp-btn { padding: 6px 12px; border-radius: 8px; border: 1px solid var(--rs-input-border, #3d3d5c); background: var(--rs-input-bg, #16162a); color: var(--rs-text-primary, #e2e8f0); font-size: 12px; cursor: pointer; transition: border-color 0.15s, background 0.15s; white-space: nowrap; } .cp-btn:hover { border-color: var(--rs-border-strong, #4d4d6c); } .cp-btn--add { background: #10b98122; border-color: #10b98155; color: #34d399; } .cp-btn--add:hover { background: #10b98133; border-color: #10b981; } .cp-btn--postiz { background: #6366f122; border-color: #6366f155; color: #818cf8; } .cp-btn--postiz:hover { background: #6366f133; border-color: #6366f1; } /* ── Canvas area ── */ .cp-canvas-area { flex: 1; display: flex; overflow: hidden; position: relative; } .cp-canvas { flex: 1; position: relative; overflow: hidden; cursor: grab; background: var(--rs-canvas-bg, #0f0f23); } .cp-canvas.grabbing { cursor: grabbing; } .cp-canvas.wiring { cursor: crosshair; } .cp-canvas svg { display: block; width: 100%; height: 100%; } /* ── Zoom controls ── */ .cp-zoom-controls { position: absolute; bottom: 12px; right: 12px; display: flex; align-items: center; gap: 4px; background: var(--rs-bg-surface, #1a1a2e); border: 1px solid var(--rs-border-strong, #3d3d5c); border-radius: 8px; padding: 4px 6px; z-index: 5; } .cp-zoom-btn { width: 28px; height: 28px; border: none; border-radius: 6px; background: transparent; color: var(--rs-text-primary, #e2e8f0); font-size: 16px; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s; } .cp-zoom-btn:hover { background: var(--rs-bg-surface-raised, #252545); } .cp-zoom-level { font-size: 11px; color: var(--rs-text-muted, #94a3b8); min-width: 36px; text-align: center; } /* ── Node styles ── */ .cp-node { cursor: pointer; } .cp-node.selected > foreignObject > div, .cp-node.selected > rect { outline: 2px solid #6366f1; outline-offset: 2px; } .cp-node foreignObject > div { transition: border-color 0.15s; } .cp-node:hover foreignObject > div { border-color: #4f46e5 !important; } /* ── Port styles ── */ .port-group { cursor: crosshair; } .port-dot { transition: r 0.15s, filter 0.15s; } .port-group:hover .port-dot { r: 7; filter: drop-shadow(0 0 4px currentColor); } .port-group--wiring-source .port-dot { r: 7; filter: drop-shadow(0 0 6px currentColor); } .port-group--wiring-target .port-dot { r: 7; animation: port-pulse 0.8s ease-in-out infinite; } .port-group--wiring-dimmed .port-dot { opacity: 0.2; } @keyframes port-pulse { 0%, 100% { filter: drop-shadow(0 0 3px currentColor); } 50% { filter: drop-shadow(0 0 8px currentColor); } } /* ── Edge styles ── */ .edge-group { pointer-events: stroke; } .edge-path-publish { stroke-dasharray: 8 4; animation: edge-dash 1s linear infinite; filter: drop-shadow(0 0 3px var(--edge-color, #10b981)); } .edge-path-sequence { stroke-linecap: round; } .edge-path-target { stroke-dasharray: 4 6; } .edge-hit-area { cursor: pointer; } .edge-glow { pointer-events: none; } .edge-drag-handle { fill: var(--rs-bg-surface, #1a1a2e); stroke: var(--rs-text-muted, #94a3b8); stroke-width: 1.5; cursor: grab; opacity: 0; transition: opacity 0.15s; } .edge-group:hover .edge-drag-handle { opacity: 1; } @keyframes edge-dash { to { stroke-dashoffset: -24; } } /* ── Wiring temp line ── */ .wiring-temp-path { fill: none; stroke: #6366f1; stroke-width: 2; stroke-dasharray: 6 4; opacity: 0.7; pointer-events: none; } /* ── Inline config panel ── */ .cp-inline-config { background: var(--rs-bg-surface, #1a1a2e); border: 1px solid var(--rs-border-strong, #3d3d5c); border-radius: 10px; overflow: hidden; font-size: 12px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); } .cp-icp-header { padding: 10px 12px; border-bottom: 1px solid var(--rs-border, #2d2d44); font-weight: 600; font-size: 13px; display: flex; align-items: center; gap: 6px; } .cp-icp-body { padding: 10px 12px; display: flex; flex-direction: column; gap: 8px; max-height: 300px; overflow-y: auto; } .cp-icp-body label { font-size: 11px; color: var(--rs-text-muted, #94a3b8); margin-bottom: 2px; } .cp-icp-body input, .cp-icp-body select, .cp-icp-body textarea { width: 100%; padding: 6px 8px; border-radius: 6px; border: 1px solid var(--rs-input-border, #3d3d5c); background: var(--rs-input-bg, #16162a); color: var(--rs-text-primary, #e2e8f0); font-size: 12px; font-family: inherit; box-sizing: border-box; } .cp-icp-body textarea { resize: vertical; min-height: 60px; } .cp-icp-toolbar { padding: 8px 12px; border-top: 1px solid var(--rs-border, #2d2d44); display: flex; gap: 6px; } .cp-icp-toolbar button { flex: 1; padding: 5px 8px; border-radius: 6px; border: none; font-size: 11px; cursor: pointer; font-weight: 600; } .cp-icp-btn-done { background: #10b981; color: white; } .cp-icp-btn-delete { background: #ef4444; color: white; } /* ── Context menu ── */ .cp-context-menu { position: absolute; z-index: 50; background: var(--rs-bg-surface, #1a1a2e); border: 1px solid var(--rs-border-strong, #3d3d5c); border-radius: 10px; padding: 4px; min-width: 160px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.5); } .cp-ctx-item { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: 6px; cursor: pointer; font-size: 12px; color: var(--rs-text-primary, #e2e8f0); transition: background 0.1s; } .cp-ctx-item:hover { background: var(--rs-bg-surface-raised, #252545); } .cp-ctx-sep { height: 1px; background: var(--rs-border, #2d2d44); margin: 4px 8px; } /* ── Phase node (background container) ── */ .cp-phase-rect { rx: 12; ry: 12; stroke-width: 1.5; stroke-dasharray: 6 3; } .cp-phase-label { font-size: 13px; font-weight: 700; fill: var(--rs-text-primary, #e2e8f0); } .cp-phase-date { font-size: 10px; fill: var(--rs-text-muted, #94a3b8); } .cp-phase-progress-bg { fill: rgba(255, 255, 255, 0.06); rx: 2; ry: 2; } .cp-phase-progress-fill { rx: 2; ry: 2; } /* ── Postiz slide-out panel ── */ .cp-postiz-panel { width: 0; overflow: hidden; border-left: 1px solid var(--rs-border, #2d2d44); background: var(--rs-bg-surface, #1a1a2e); display: flex; flex-direction: column; transition: width 0.3s ease; } .cp-postiz-panel.open { width: 60%; min-width: 400px; } .cp-postiz-header { display: flex; align-items: center; gap: 8px; padding: 10px 16px; border-bottom: 1px solid var(--rs-border, #2d2d44); min-height: 44px; } .cp-postiz-title { font-size: 13px; font-weight: 600; flex: 1; } .cp-postiz-close { background: none; border: none; color: var(--rs-text-muted, #94a3b8); font-size: 16px; cursor: pointer; padding: 4px; } .cp-postiz-close:hover { color: var(--rs-text-primary, #e2e8f0); } .cp-postiz-iframe { flex: 1; border: none; width: 100%; } /* ── Mobile ── */ @media (max-width: 768px) { .cp-postiz-panel.open { position: absolute; top: 0; right: 0; width: 100%; height: 100%; z-index: 20; min-width: unset; } .cp-toolbar { flex-wrap: wrap; padding: 8px 12px; } .cp-toolbar__actions { flex-wrap: wrap; } }