fractostate 4.3.2 → 4.3.3

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.
Files changed (48) hide show
  1. package/dist/cjs/index.js +5 -2
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/src/devtools/FractoDevTools.js +3 -1
  4. package/dist/cjs/src/devtools/FractoDevTools.js.map +1 -1
  5. package/dist/cjs/src/devtools/MapUtils.js +3 -11
  6. package/dist/cjs/src/devtools/MapUtils.js.map +1 -1
  7. package/dist/cjs/src/devtools/MentalMap.css.js +1 -1
  8. package/dist/cjs/src/devtools/MentalMap.js +141 -80
  9. package/dist/cjs/src/devtools/MentalMap.js.map +1 -1
  10. package/dist/cjs/src/devtools/PluginManager.js +1 -1
  11. package/dist/cjs/src/devtools/PluginManager.js.map +1 -1
  12. package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js +99 -0
  13. package/dist/cjs/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
  14. package/dist/cjs/src/devtools/mmap/components/FlowNodes.js +14 -0
  15. package/dist/cjs/src/devtools/mmap/components/FlowNodes.js.map +1 -0
  16. package/dist/cjs/src/devtools/mmap/components/MMapLedger.js +22 -0
  17. package/dist/cjs/src/devtools/mmap/components/MMapLedger.js.map +1 -0
  18. package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js +14 -0
  19. package/dist/cjs/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
  20. package/dist/cjs/src/plugins/storage/StorageAdapter.js +38 -4
  21. package/dist/cjs/src/plugins/storage/StorageAdapter.js.map +1 -1
  22. package/dist/cjs/src/store.js +35 -13
  23. package/dist/cjs/src/store.js.map +1 -1
  24. package/dist/esm/index.js +5 -2
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/src/devtools/FractoDevTools.js +3 -1
  27. package/dist/esm/src/devtools/FractoDevTools.js.map +1 -1
  28. package/dist/esm/src/devtools/MapUtils.js +5 -11
  29. package/dist/esm/src/devtools/MapUtils.js.map +1 -1
  30. package/dist/esm/src/devtools/MentalMap.css.js +1 -1
  31. package/dist/esm/src/devtools/MentalMap.js +141 -80
  32. package/dist/esm/src/devtools/MentalMap.js.map +1 -1
  33. package/dist/esm/src/devtools/PluginManager.js +2 -2
  34. package/dist/esm/src/devtools/PluginManager.js.map +1 -1
  35. package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js +97 -0
  36. package/dist/esm/src/devtools/mmap/components/FlowGenealogy.js.map +1 -0
  37. package/dist/esm/src/devtools/mmap/components/FlowNodes.js +10 -0
  38. package/dist/esm/src/devtools/mmap/components/FlowNodes.js.map +1 -0
  39. package/dist/esm/src/devtools/mmap/components/MMapLedger.js +20 -0
  40. package/dist/esm/src/devtools/mmap/components/MMapLedger.js.map +1 -0
  41. package/dist/esm/src/devtools/mmap/components/MMapSidebar.js +12 -0
  42. package/dist/esm/src/devtools/mmap/components/MMapSidebar.js.map +1 -0
  43. package/dist/esm/src/plugins/storage/StorageAdapter.js +38 -4
  44. package/dist/esm/src/plugins/storage/StorageAdapter.js.map +1 -1
  45. package/dist/esm/src/store.js +35 -13
  46. package/dist/esm/src/store.js.map +1 -1
  47. package/dist/plugins.d.ts +1 -1
  48. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MapUtils.js","sources":["../../../../src/devtools/MapUtils.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\n// --- Custom Nodes ---\n\nimport { EdgeProps, getBezierPath, Handle, Position } from \"@xyflow/react\";\nimport { Database } from \"lucide-react\";\n\nexport const FlowNode = ({ data }: any) => (\n // Added \"nodrag\" class to allow clicking without dragging the canvas\n <div\n className={`m2-node-flow nodrag`}\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n if (data.onClick) data.onClick();\n }}\n >\n {/* ${data.isActive ? \"active\" : \"\"} */}\n\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div className=\"m2-node-flow-header\">\n <div className=\"m2-node-icon\">\n <Database size={18} />\n </div>\n <div className=\"m2-node-title\">{data.label}</div>\n </div>\n <div className=\"m2-node-preview\">\n {JSON.stringify(data.value, null, 2).slice(0, 80)}...\n </div>\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n </div>\n);\n\nexport const ActorNode = ({ data }: any) => (\n <div className={`m2-node-actor nodrag ${data.isActive ? \"active\" : \"\"}`}>\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div className=\"m2-actor-avatar\">{data.label.charAt(0).toUpperCase()}</div>\n <div className=\"m2-actor-name\">{data.label}</div>\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n </div>\n);\n\n// --- Custom Edge ---\n\nexport const FiberEdge = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n}: EdgeProps) => {\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n return (\n <>\n <path\n id={id}\n style={style}\n className=\"m2-edge-path\"\n d={edgePath}\n markerEnd={markerEnd}\n />\n <path id={`${id}-pulse`} className=\"m2-edge-pulse\" d={edgePath} />\n </>\n );\n};\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"MapUtils.js","sources":["../../../../src/devtools/MapUtils.tsx"],"sourcesContent":["/* *****************************************************************************\n * FractoSate\n *\n * ACCESS RESTRICTIONS:\n * - This software is exclusively for use by Authorized Personnel of NEHONIX\n * - Intended for Internal Use only within NEHONIX operations\n * - No rights granted to unauthorized individuals or entities\n * - All modifications are works made for hire assigned to NEHONIX\n *\n * PROHIBITED ACTIVITIES:\n * - Copying, distributing, or sublicensing without written permission\n * - Reverse engineering, decompiling, or disassembling\n * - Creating derivative works without explicit authorization\n * - External use or commercial distribution outside NEHONIX\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n *\n * For questions or permissions, contact:\n * NEHONIX Legal Department\n * Email: legal@nehonix.com\n * Website: www.nehonix.com\n ***************************************************************************** */\n\n// --- Custom Nodes ---\n\nimport { EdgeProps, getBezierPath, Handle, Position } from \"@xyflow/react\";\nimport { Database } from \"lucide-react\";\n\nexport const FlowNode = ({ data }: any) => (\n // Added \"nodrag\" class to allow clicking without dragging the canvas\n <div\n className={`m2-node-flow nodrag`}\n style={{ cursor: \"pointer\" }}\n onClick={() => {\n if (data.onClick) data.onClick();\n }}\n >\n {/* ${data.isActive ? \"active\" : \"\"} */}\n\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div className=\"m2-node-flow-header\">\n <div className=\"m2-node-icon\">\n <Database size={18} />\n </div>\n <div className=\"m2-node-title\">{data.label}</div>\n </div>\n <div className=\"m2-node-preview\">\n {JSON.stringify(data.value, null, 2).slice(0, 80)}...\n </div>\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n </div>\n);\n\nexport const ActorNode = ({ data }: any) => (\n <div className={`m2-node-actor nodrag ${data.isActive ? \"active\" : \"\"}`}>\n <Handle type=\"target\" position={Position.Left} style={{ opacity: 0 }} />\n <div className=\"m2-actor-avatar\">{data.label.charAt(0).toUpperCase()}</div>\n <div className=\"m2-actor-name\">{data.label}</div>\n <Handle type=\"source\" position={Position.Right} style={{ opacity: 0 }} />\n </div>\n);\n\n// --- Custom Edge ---\n\nexport const FiberEdge = ({\n id,\n sourceX,\n sourceY,\n targetX,\n targetY,\n sourcePosition,\n targetPosition,\n style = {},\n markerEnd,\n}: EdgeProps) => {\n const [edgePath] = getBezierPath({\n sourceX,\n sourceY,\n sourcePosition,\n targetX,\n targetY,\n targetPosition,\n });\n\n const strokeColor = style.stroke || \"var(--m2-accent-cyan)\";\n\n return (\n <>\n <path\n id={id}\n style={{ ...style, stroke: strokeColor, opacity: 0.3 }}\n className=\"m2-edge-path\"\n d={edgePath}\n markerEnd={markerEnd}\n />\n <path\n id={`${id}-pulse`}\n className=\"m2-edge-pulse\"\n style={{ stroke: strokeColor }}\n d={edgePath}\n />\n </>\n );\n};\n"],"names":["_jsxs","_Fragment","_jsx"],"mappings":";;;;AAoEA;AAEO,MAAM,SAAS,GAAG,CAAC,EACxB,EAAE,EACF,OAAO,EACP,OAAO,EACP,OAAO,EACP,OAAO,EACP,cAAc,EACd,cAAc,EACd,KAAK,GAAG,EAAE,EACV,SAAS,GACC,KAAI;AACd,IAAA,MAAM,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC;QAC/B,OAAO;QACP,OAAO;QACP,cAAc;QACd,OAAO;QACP,OAAO;QACP,cAAc;AACf,KAAA,CAAC;AAEF,IAAA,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,IAAI,uBAAuB;AAE3D,IAAA,QACEA,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACEC,GAAA,CAAA,MAAA,EAAA,EACE,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,EACtD,SAAS,EAAC,cAAc,EACxB,CAAC,EAAE,QAAQ,EACX,SAAS,EAAE,SAAS,EAAA,CACpB,EACFA,GAAA,CAAA,MAAA,EAAA,EACE,EAAE,EAAE,CAAA,EAAG,EAAE,CAAA,MAAA,CAAQ,EACjB,SAAS,EAAC,eAAe,EACzB,KAAK,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAC9B,CAAC,EAAE,QAAQ,EAAA,CACX,CAAA,EAAA,CACD;AAEP;;;;"}
@@ -1,4 +1,4 @@
1
- var css_248z = "@import url(\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap\");:root{--m2-bg:#030302ce;--m2-panel-bg:rgba(10,10,16,.85);--m2-card-bg:rgba(22,22,34,.7);--m2-border:hsla(0,0%,100%,.08);--m2-accent-cyan:#00d4ff;--m2-accent-purple:#8b5cf6;--m2-accent-glow:rgba(0,212,255,.3);--m2-text-dim:#94a3b8;--m2-text-bright:#f8fafc;--m2-sidebar-w:280px;--m2-ledger-w:420px;--m2-glass-border:1px solid hsla(0,0%,100%,.1)}.mental-map-overlay{align-items:center;backdrop-filter:none;background:rgba(0,0,0,.05);color:var(--m2-text-bright);display:flex;font-family:Plus Jakarta Sans,sans-serif;inset:0;justify-content:center;pointer-events:none;position:fixed;z-index:999999}.mental-map-overlay *{pointer-events:auto}.mental-map-container{backdrop-filter:blur(20px);background:rgba(15,15,25,.94);border:1px solid rgba(0,212,255,.3);border-radius:32px;box-shadow:0 40px 120px rgba(0,0,0,.8),inset 0 0 1px rgba(0,212,255,.5);display:flex;flex-direction:column;height:92vh;overflow:hidden;position:relative;transition:width .6s,height .6s,border-radius .6s,transform 0s;width:96vw}.mental-map-container.minimized{align-items:center;backdrop-filter:blur(10px);background:linear-gradient(135deg,#1a1a2e,#16213e);border:2px solid rgba(0,212,255,.4);border-radius:16px;box-shadow:0 8px 32px rgba(0,212,255,.3),inset 0 0 20px rgba(0,212,255,.2);cursor:grab;display:flex;height:56px;justify-content:center;position:fixed;user-select:none;width:56px;z-index:10000}.mental-map-container.minimized:active{cursor:grabbing}.mental-map-container.minimized>:not(.m2-minimized-logo){display:none!important}.m2-minimized-logo{align-items:center;color:#fff;display:none;font-family:system-ui,-apple-system,sans-serif;font-size:28px;font-weight:700;height:100%;justify-content:center;position:relative;width:100%}.m2-minimized-logo.pulse{animation:m2LogoPulse .4s cubic-bezier(.4,0,.2,1)}@keyframes m2LogoPulse{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.mental-map-container.minimized .m2-minimized-logo{display:flex}.m2-minimized-badge{background:#00d4ff;border:1px solid #fff;border-radius:5px;box-shadow:0 4px 10px rgba(0,0,0,.5);color:#000;font-size:8px;font-weight:900;padding:2px 5px;position:absolute;right:-8px;top:-8px}.m2-header{background:hsla(0,0%,100%,.02);border-bottom:var(--m2-glass-border);height:80px;justify-content:space-between;padding:0 40px;z-index:100}.m2-header,.m2-logo-group{align-items:center;display:flex}.m2-logo-group{gap:16px}.m2-logo-icon{align-items:center;background:linear-gradient(135deg,#1a1a2e,#16213e);border-radius:14px;box-shadow:0 0 20px rgba(0,212,255,.4);display:flex;font-size:24px;height:48px;justify-content:center;width:48px}.m2-header-titles h1{-webkit-text-fill-color:transparent;background:linear-gradient(90deg,#fff,#94a3b8);-webkit-background-clip:text;background-clip:text;font-size:20px;font-weight:800;letter-spacing:-.02em;margin:0}.m2-header-meta{align-items:center;display:flex;gap:12px;margin-top:2px}.m2-engine-badge{background:rgba(0,212,255,.1);border:1px solid rgba(0,212,255,.2);border-radius:6px;color:#00d4ff;font-size:10px;font-weight:800;padding:2px 8px;text-transform:uppercase}.m2-controls{align-items:center;display:flex;gap:24px}.m2-search-wrapper{position:relative;width:380px}.m2-search-input{background:hsla(0,0%,100%,.03);border:var(--m2-glass-border);border-radius:12px;color:#fff;font-size:14px;padding:12px 16px 12px 48px;transition:all .3s;width:100%}.m2-search-input:focus{background:hsla(0,0%,100%,.06);border-color:var(--m2-accent-cyan);box-shadow:0 0 0 4px rgba(0,212,255,.1);outline:none}.m2-search-icon{color:var(--m2-text-dim);left:16px;position:absolute;top:50%;transform:translateY(-50%)}.m2-action-btns{display:flex;gap:8px}.m2-icon-btn{align-items:center;background:hsla(0,0%,100%,.03);border:var(--m2-glass-border);border-radius:12px;color:var(--m2-text-dim);cursor:pointer;display:flex;height:44px;justify-content:center;transition:all .2s;width:44px}.m2-icon-btn:hover{background:hsla(0,0%,100%,.08);color:var(--m2-text-bright)}.m2-close-btn{background:rgba(239,68,68,.1)!important;color:#ef4444!important}.m2-icon-btn.force-visible{display:flex!important;opacity:1!important;visibility:visible!important}.m2-layout{display:flex;flex:1;overflow:hidden}.m2-sidebar{background:rgba(0,0,0,.2);border-right:var(--m2-glass-border);display:flex;flex-direction:column;width:var(--m2-sidebar-w)}.m2-sec-header{color:var(--m2-text-dim);font-size:11px;font-weight:800;letter-spacing:.1em;padding:32px 24px 16px;text-transform:uppercase}.m2-list{flex:1;overflow-y:auto;padding:0 16px}.m2-flow-card{align-items:center;border:1px solid transparent;border-radius:16px;cursor:pointer;display:flex;gap:12px;margin-bottom:8px;padding:12px 16px;transition:all .2s}.m2-flow-card:hover{background:hsla(0,0%,100%,.03);border-color:hsla(0,0%,100%,.05)}.m2-flow-card.active{background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(139,92,246,.1));border-color:rgba(0,212,255,.2)}.m2-flow-card.is-active-now .m2-flow-indicator{animation:markerPulse 1s infinite}.m2-flow-indicator{background:var(--m2-accent-cyan);border-radius:3px;box-shadow:0 0 10px var(--m2-accent-cyan);height:10px;width:10px}@keyframes markerPulse{0%{box-shadow:0 0 0 0 rgba(0,212,255,.7);transform:scale(1)}70%{box-shadow:0 0 0 10px rgba(0,212,255,0);transform:scale(1.2)}to{box-shadow:0 0 0 0 rgba(0,212,255,0);transform:scale(1)}}.m2-flow-info{flex:1}.m2-flow-name{display:block;font-size:14px;font-weight:600}.m2-flow-stats{color:var(--m2-text-dim);font-size:10px}.m2-canvas{background:radial-gradient(circle at center,rgba(139,92,246,.03) 0,transparent 70%);flex:1;position:relative}.m2-node-flow{backdrop-filter:blur(12px);background:var(--m2-card-bg);border:var(--m2-glass-border);border-radius:20px;box-shadow:0 10px 30px rgba(0,0,0,.4);color:#fff;padding:20px;transition:transform .2s;width:240px}.m2-node-flow:hover{border-color:var(--m2-accent-cyan);transform:scale(1.02)}.m2-node-flow-header{align-items:center;display:flex;gap:12px;margin-bottom:12px}.m2-node-icon{align-items:center;background:rgba(0,212,255,.1);border-radius:8px;color:var(--m2-accent-cyan);display:flex;height:32px;justify-content:center;width:32px}.m2-node-title{font-size:13px;font-weight:800;letter-spacing:1px;text-transform:uppercase}.m2-node-preview{background:rgba(0,0,0,.3);border:1px solid hsla(0,0%,100%,.03);border-radius:12px;color:#94a3b8;font-family:JetBrains Mono,monospace;font-size:10px;padding:12px;white-space:pre-wrap}.m2-node-actor{align-items:center;backdrop-filter:blur(12px);background:rgba(139,92,246,.05);border:1px solid rgba(139,92,246,.2);border-radius:50px;box-shadow:0 10px 20px rgba(0,0,0,.2);color:var(--m2-accent-purple);display:flex;gap:10px;padding:8px 16px}.m2-actor-avatar{align-items:center;background:var(--m2-accent-purple);border-radius:50%;color:#fff;display:flex;font-size:10px;font-weight:800;height:24px;justify-content:center;width:24px}.m2-actor-name{font-size:12px;font-weight:700}.m2-edge-path{stroke:hsla(0,0%,100%,.1);stroke-width:2px;fill:none}.m2-edge-pulse{stroke:var(--m2-accent-cyan);stroke-width:3px;stroke-dasharray:5,20;animation:fiberPulse 3s linear infinite;filter:blur(2px);opacity:.8}@keyframes fiberPulse{to{stroke-dashoffset:-100}}.m2-ledger{background:rgba(0,0,0,.3);border-left:var(--m2-glass-border);display:flex;flex-direction:column;transition:width .4s cubic-bezier(.4,0,.2,1),opacity .3s,padding .4s;width:var(--m2-ledger-w)}.m2-ledger.hidden{border-left:none;opacity:0;pointer-events:none;width:0}.m2-ledger-controls{border-bottom:var(--m2-glass-border);padding:32px 24px 16px}.m2-ledger-title-row{align-items:center;display:flex;justify-content:space-between;margin-bottom:24px;min-width:calc(var(--m2-ledger-w) - 48px)}.m2-ledger-title{color:var(--m2-text-dim);font-size:14px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.m2-filter-tabs{display:flex;gap:8px;margin-bottom:0}.m2-tab{background:hsla(0,0%,100%,.03);border:1px solid transparent;border-radius:8px;color:var(--m2-text-dim);cursor:pointer;flex:1;font-size:11px;font-weight:800;padding:8px;text-align:center;transition:all .2s}.m2-tab.active{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.1);color:#fff}.m2-trace-list{flex:1;overflow-y:auto;padding:24px}.m2-trace-card{margin-bottom:32px;padding-left:24px;position:relative}.m2-trace-card:before{background:linear-gradient(to bottom,var(--m2-accent-cyan),transparent);bottom:-32px;content:\"\";left:0;position:absolute;top:0;width:1px}.m2-trace-card.reset:before{background:linear-gradient(180deg,#ef4444,transparent)}.m2-trace-dot{background:var(--m2-accent-cyan);border-radius:50%;box-shadow:0 0 10px var(--m2-accent-cyan);height:9px;left:-4px;position:absolute;top:0;width:9px}.m2-trace-card.reset .m2-trace-dot{background:#ef4444;box-shadow:0 0 10px #ef4444}.m2-trace-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:12px}.m2-trace-actor-lbl{color:#fff;font-size:13px;font-weight:700}.m2-trace-ts{color:var(--m2-text-dim);font-size:10px}.m2-trace-op-info{align-items:center;display:flex;gap:8px;margin-bottom:12px}.m2-op-type{background:rgba(0,212,255,.1);border-radius:4px;color:var(--m2-accent-cyan);font-weight:700;padding:2px 8px;text-transform:uppercase}.m2-op-type,.m2-path-tag{font-family:JetBrains Mono,monospace;font-size:9px}.m2-path-tag{color:var(--m2-text-dim)}.m2-trace-data{background:rgba(0,0,0,.4);border:var(--m2-glass-border);border-radius:12px;padding:16px}.m2-trace-json{color:#94a3b8;font-family:JetBrains Mono,monospace;font-size:11px;margin:0;max-height:200px;overflow-y:auto}.m2-flow-overlay-backdrop{align-items:center;backdrop-filter:blur(4px);background:rgba(0,0,0,.6);display:flex;inset:0;justify-content:center;position:absolute;z-index:1000}.m2-flow-overlay{animation:popupIn .3s cubic-bezier(.16,1,.3,1);backdrop-filter:blur(32px);background:var(--m2-panel-bg);border:var(--m2-glass-border);border-radius:24px;box-shadow:0 40px 100px rgba(0,0,0,.8);display:flex;flex-direction:column;max-height:80%;overflow:hidden;width:600px}@keyframes popupIn{0%{opacity:0;transform:translateY(20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.m2-overlay-header{align-items:center;background:hsla(0,0%,100%,.02);border-bottom:var(--m2-glass-border);display:flex;justify-content:space-between;padding:24px 32px}.m2-overlay-title{align-items:center;display:flex;gap:12px}.m2-overlay-title h2{color:#fff;font-size:18px;font-weight:800;margin:0}.m2-overlay-content{flex:1;overflow-y:auto;padding:24px 32px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.1);border-radius:10px}::-webkit-scrollbar-thumb:hover{background:hsla(0,0%,100%,.2)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.m2-trace-card{animation:fadeIn .4s cubic-bezier(.16,1,.3,1) both}.m2-empty-state{align-items:center;animation:fadeIn .4s;color:var(--m2-text-dim);display:flex;flex-direction:column;height:100%;justify-content:center;padding:40px;text-align:center}.m2-empty-icon{color:hsla(0,0%,100%,.1);margin-bottom:24px}.m2-empty-state h3{color:var(--m2-text-bright);font-size:18px;margin:0 0 12px}.m2-empty-state p{font-size:14px;line-height:1.5;max-width:300px}";
1
+ var css_248z = "@import url(\"https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap\");:root{--m2-bg:#030302ce;--m2-panel-bg:rgba(10,10,16,.85);--m2-card-bg:rgba(22,22,34,.7);--m2-border:hsla(0,0%,100%,.08);--m2-accent-cyan:#00d4ff;--m2-accent-purple:#8b5cf6;--m2-accent-glow:rgba(0,212,255,.3);--m2-text-dim:#94a3b8;--m2-text-bright:#f8fafc;--m2-sidebar-w:280px;--m2-ledger-w:420px;--m2-glass-border:1px solid hsla(0,0%,100%,.1)}.mental-map-overlay{align-items:center;backdrop-filter:none;background:rgba(0,0,0,.05);color:var(--m2-text-bright);display:flex;font-family:Plus Jakarta Sans,sans-serif;inset:0;justify-content:center;pointer-events:none;position:fixed;z-index:999999}.mental-map-overlay *{pointer-events:auto}.mental-map-container{backdrop-filter:blur(20px);background:rgba(15,15,25,.94);border:1px solid rgba(0,212,255,.3);border-radius:32px;box-shadow:0 40px 120px rgba(0,0,0,.8),inset 0 0 1px rgba(0,212,255,.5);display:flex;flex-direction:column;height:92vh;overflow:hidden;position:relative;transition:width .6s,height .6s,border-radius .6s,transform 0s;width:96vw}.mental-map-container.minimized{align-items:center;backdrop-filter:blur(10px);background:linear-gradient(135deg,#1a1a2e,#16213e);border:2px solid rgba(0,212,255,.4);border-radius:16px;box-shadow:0 8px 32px rgba(0,212,255,.3),inset 0 0 20px rgba(0,212,255,.2);cursor:grab;display:flex;height:56px;justify-content:center;position:fixed;user-select:none;width:56px;z-index:10000}.mental-map-container.minimized:active{cursor:grabbing}.mental-map-container.minimized>:not(.m2-minimized-logo){display:none!important}.m2-minimized-logo{align-items:center;color:#fff;display:none;font-family:system-ui,-apple-system,sans-serif;font-size:28px;font-weight:700;height:100%;justify-content:center;position:relative;width:100%}.m2-minimized-logo.pulse{animation:m2LogoPulse .4s cubic-bezier(.4,0,.2,1)}@keyframes m2LogoPulse{0%{transform:scale(1)}50%{transform:scale(1.1)}to{transform:scale(1)}}.mental-map-container.minimized .m2-minimized-logo{display:flex}.m2-minimized-badge{background:#00d4ff;border:1px solid #fff;border-radius:5px;box-shadow:0 4px 10px rgba(0,0,0,.5);color:#000;font-size:8px;font-weight:900;padding:2px 5px;position:absolute;right:-8px;top:-8px}.m2-header{background:hsla(0,0%,100%,.02);border-bottom:var(--m2-glass-border);height:80px;justify-content:space-between;padding:0 40px;z-index:100}.m2-header,.m2-logo-group{align-items:center;display:flex}.m2-logo-group{gap:16px}.m2-logo-icon{align-items:center;background:linear-gradient(135deg,#1a1a2e,#16213e);border-radius:14px;box-shadow:0 0 20px rgba(0,212,255,.4);display:flex;font-size:24px;height:48px;justify-content:center;width:48px}.m2-header-titles h1{-webkit-text-fill-color:transparent;background:linear-gradient(90deg,#fff,#94a3b8);-webkit-background-clip:text;background-clip:text;font-size:20px;font-weight:800;letter-spacing:-.02em;margin:0}.m2-header-meta{align-items:center;display:flex;gap:12px;margin-top:2px}.m2-engine-badge{background:rgba(0,212,255,.1);border:1px solid rgba(0,212,255,.2);border-radius:6px;color:#00d4ff;font-size:10px;font-weight:800;padding:2px 8px;text-transform:uppercase}.m2-controls{align-items:center;display:flex;gap:24px}.m2-search-wrapper{position:relative;width:380px}.m2-search-input{background:hsla(0,0%,100%,.03);border:var(--m2-glass-border);border-radius:12px;color:#fff;font-size:14px;padding:12px 16px 12px 48px;transition:all .3s;width:100%}.m2-search-input:focus{background:hsla(0,0%,100%,.06);border-color:var(--m2-accent-cyan);box-shadow:0 0 0 4px rgba(0,212,255,.1);outline:none}.m2-search-icon{color:var(--m2-text-dim);left:16px;position:absolute;top:50%;transform:translateY(-50%)}.m2-action-btns{display:flex;gap:8px}.m2-icon-btn{align-items:center;background:hsla(0,0%,100%,.03);border:var(--m2-glass-border);border-radius:12px;color:var(--m2-text-dim);cursor:pointer;display:flex;height:44px;justify-content:center;transition:all .2s;width:44px}.m2-icon-btn:hover{background:hsla(0,0%,100%,.08);color:var(--m2-text-bright)}.m2-close-btn{background:rgba(239,68,68,.1)!important;color:#ef4444!important}.m2-icon-btn.force-visible{display:flex!important;opacity:1!important;visibility:visible!important}.m2-layout{display:flex;flex:1;overflow:hidden}.m2-sidebar{background:rgba(0,0,0,.2);border-right:var(--m2-glass-border);display:flex;flex-direction:column;width:var(--m2-sidebar-w)}.m2-sec-header{color:var(--m2-text-dim);font-size:11px;font-weight:800;letter-spacing:.1em;padding:32px 24px 16px;text-transform:uppercase}.m2-list{flex:1;overflow-y:auto;padding:0 16px}.m2-flow-card{align-items:center;border:1px solid transparent;border-radius:16px;cursor:pointer;display:flex;gap:12px;margin-bottom:8px;padding:12px 16px;transition:all .2s}.m2-flow-card:hover{background:hsla(0,0%,100%,.03);border-color:hsla(0,0%,100%,.05)}.m2-flow-card.active{background:linear-gradient(135deg,rgba(0,212,255,.1),rgba(139,92,246,.1));border-color:rgba(0,212,255,.2)}.m2-flow-card.is-active-now .m2-flow-indicator{animation:markerPulse 1s infinite}.m2-flow-indicator{background:var(--m2-accent-cyan);border-radius:3px;box-shadow:0 0 10px var(--m2-accent-cyan);height:10px;width:10px}@keyframes markerPulse{0%{box-shadow:0 0 0 0 rgba(0,212,255,.7);transform:scale(1)}70%{box-shadow:0 0 0 10px rgba(0,212,255,0);transform:scale(1.2)}to{box-shadow:0 0 0 0 rgba(0,212,255,0);transform:scale(1)}}.m2-flow-info{flex:1}.m2-flow-name{display:block;font-size:14px;font-weight:600}.m2-flow-stats{color:var(--m2-text-dim);font-size:10px}.m2-canvas{background:radial-gradient(circle at center,rgba(139,92,246,.03) 0,transparent 70%);flex:1;position:relative}.m2-node-flow{backdrop-filter:blur(12px);background:var(--m2-card-bg);border:var(--m2-glass-border);border-radius:20px;box-shadow:0 10px 30px rgba(0,0,0,.4);color:#fff;padding:20px;transition:transform .2s;width:240px}.m2-node-flow.is-hot,.m2-node-flow:hover{border-color:#fbbf24;box-shadow:0 0 25px rgba(251,191,36,.4);transform:scale(1.02)}.m2-node-flow-header{align-items:center;display:flex;gap:12px;margin-bottom:12px}.m2-node-icon{align-items:center;background:rgba(0,212,255,.1);border-radius:8px;color:var(--m2-accent-cyan);display:flex;height:32px;justify-content:center;width:32px}.m2-node-title{font-size:13px;font-weight:800;letter-spacing:1px;text-transform:uppercase}.m2-node-preview{background:rgba(0,0,0,.3);border:1px solid hsla(0,0%,100%,.03);border-radius:12px;color:#94a3b8;font-family:JetBrains Mono,monospace;font-size:10px;padding:12px;white-space:pre-wrap}.m2-node-actor{align-items:center;backdrop-filter:blur(12px);background:rgba(168,85,247,.1);border:1px solid rgba(168,85,247,.4);border-radius:12px;box-shadow:0 0 20px rgba(168,85,247,.15);color:#c084fc;display:flex;gap:12px;padding:10px 16px;transition:all .3s cubic-bezier(.4,0,.2,1)}.m2-node-actor.active,.m2-node-actor.is-hot{background:rgba(251,191,36,.1);border-color:#fbbf24;box-shadow:0 0 30px rgba(251,191,36,.5)}.m2-actor-avatar{align-items:center;background:#a855f7;border-radius:8px;box-shadow:0 0 10px rgba(168,85,247,.5);color:#fff;display:flex;font-size:14px;font-weight:900;height:28px;justify-content:center;width:28px}.m2-actor-name{font-size:12px;font-weight:700}.m2-node-listener{align-items:center;backdrop-filter:blur(12px);background:rgba(0,212,255,.08);border:1px solid rgba(0,212,255,.3);border-radius:50px;box-shadow:0 0 15px rgba(0,212,255,.1);color:var(--m2-accent-cyan);display:flex;gap:10px;padding:8px 18px;transition:all .3s ease}.m2-node-listener.active,.m2-node-listener.is-hot{background:rgba(251,191,36,.15);border-color:#fbbf24;box-shadow:0 0 25px rgba(251,191,36,.5)}.m2-listener-icon{align-items:center;background:var(--m2-accent-cyan);border-radius:50%;color:#000;display:flex;height:24px;justify-content:center;width:24px}.m2-listener-name{font-size:12px;font-weight:700}.m2-edge-path{stroke-width:2px;fill:none}.m2-edge-pulse{stroke-width:3px;stroke-dasharray:5,20;animation:fiberPulse 3s linear infinite;filter:blur(2px);opacity:.8}@keyframes fiberPulse{to{stroke-dashoffset:-100}}.m2-ledger{background:rgba(0,0,0,.3);border-left:var(--m2-glass-border);display:flex;flex-direction:column;transition:width .4s cubic-bezier(.4,0,.2,1),opacity .3s,padding .4s;width:var(--m2-ledger-w)}.m2-ledger.hidden{border-left:none;opacity:0;pointer-events:none;width:0}.m2-ledger-controls{border-bottom:var(--m2-glass-border);padding:32px 24px 16px}.m2-ledger-title-row{align-items:center;display:flex;justify-content:space-between;margin-bottom:24px;min-width:calc(var(--m2-ledger-w) - 48px)}.m2-ledger-title{color:var(--m2-text-dim);font-size:14px;font-weight:800;letter-spacing:.1em;text-transform:uppercase}.m2-filter-tabs{display:flex;gap:8px;margin-bottom:0}.m2-tab{background:hsla(0,0%,100%,.03);border:1px solid transparent;border-radius:8px;color:var(--m2-text-dim);cursor:pointer;flex:1;font-size:11px;font-weight:800;padding:8px;text-align:center;transition:all .2s}.m2-tab.active{background:hsla(0,0%,100%,.08);border-color:hsla(0,0%,100%,.1);color:#fff}.m2-trace-list{flex:1;overflow-y:auto;padding:24px}.m2-trace-card{margin-bottom:32px;padding-left:24px;position:relative}.m2-trace-card:before{background:linear-gradient(to bottom,var(--m2-accent-cyan),transparent);bottom:-32px;content:\"\";left:0;position:absolute;top:0;width:1px}.m2-trace-card.reset:before{background:linear-gradient(180deg,#ef4444,transparent)}.m2-trace-dot{background:var(--m2-accent-cyan);border-radius:50%;box-shadow:0 0 10px var(--m2-accent-cyan);height:9px;left:-4px;position:absolute;top:0;width:9px}.m2-trace-card.reset .m2-trace-dot{background:#ef4444;box-shadow:0 0 10px #ef4444}.m2-trace-header{align-items:flex-start;display:flex;justify-content:space-between;margin-bottom:12px}.m2-trace-actor-lbl{color:#fff;font-size:13px;font-weight:700}.m2-trace-ts{color:var(--m2-text-dim);font-size:10px}.m2-trace-op-info{align-items:center;display:flex;gap:8px;margin-bottom:12px}.m2-op-type{background:rgba(0,212,255,.1);border-radius:4px;color:var(--m2-accent-cyan);font-weight:700;padding:2px 8px;text-transform:uppercase}.m2-op-type,.m2-path-tag{font-family:JetBrains Mono,monospace;font-size:9px}.m2-path-tag{color:var(--m2-text-dim)}.m2-trace-data{background:rgba(0,0,0,.4);border:var(--m2-glass-border);border-radius:12px;padding:16px}.m2-trace-json{color:#94a3b8;font-family:JetBrains Mono,monospace;font-size:11px;margin:0;max-height:200px;overflow-y:auto}.m2-flow-overlay-backdrop{align-items:center;backdrop-filter:blur(4px);background:rgba(0,0,0,.6);display:flex;inset:0;justify-content:center;position:absolute;z-index:1000}.m2-flow-overlay{animation:popupIn .3s cubic-bezier(.16,1,.3,1);backdrop-filter:blur(32px);background:var(--m2-panel-bg);border:var(--m2-glass-border);border-radius:24px;box-shadow:0 40px 100px rgba(0,0,0,.8);display:flex;flex-direction:column;max-height:80%;overflow:hidden;width:600px}@keyframes popupIn{0%{opacity:0;transform:translateY(20px) scale(.95)}to{opacity:1;transform:translateY(0) scale(1)}}.m2-overlay-header{align-items:center;background:hsla(0,0%,100%,.02);border-bottom:var(--m2-glass-border);display:flex;justify-content:space-between;padding:24px 32px}.m2-overlay-title{align-items:center;display:flex;gap:12px}.m2-overlay-title h2{color:#fff;font-size:18px;font-weight:800;margin:0}.m2-overlay-content{flex:1;overflow-y:auto;padding:24px 32px}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:hsla(0,0%,100%,.1);border-radius:10px}::-webkit-scrollbar-thumb:hover{background:hsla(0,0%,100%,.2)}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.m2-trace-card{animation:fadeIn .4s cubic-bezier(.16,1,.3,1) both}.m2-empty-state{align-items:center;animation:fadeIn .4s;color:var(--m2-text-dim);display:flex;flex-direction:column;height:100%;justify-content:center;padding:40px;text-align:center}.m2-empty-icon{color:hsla(0,0%,100%,.1);margin-bottom:24px}.m2-empty-state h3{color:var(--m2-text-bright);font-size:18px;margin:0 0 12px}.m2-empty-state p{font-size:14px;line-height:1.5;max-width:300px}.genealogy-header-overlay{left:32px;pointer-events:none;position:absolute;top:24px;z-index:10}.gen-badge{align-items:center;background:rgba(139,92,246,.2);border:1px solid rgba(139,92,246,.3);border-radius:10px;color:#c084fc;display:inline-flex;font-size:12px;font-weight:800;gap:8px;margin-bottom:8px;padding:6px 12px;text-transform:uppercase}.genealogy-header-overlay p{color:var(--m2-text-dim);font-size:13px;margin:0}.view-toggle-btn{align-items:center;background:hsla(0,0%,100%,.05);border:var(--m2-glass-border);border-radius:10px;color:var(--m2-text-dim);cursor:pointer;display:flex;font-size:12px;font-weight:700;gap:8px;padding:8px 16px;transition:all .2s}.view-toggle-btn.active{background:var(--m2-accent-cyan);border-color:#fff;color:#000}";
2
2
  if (typeof document !== 'undefined') {
3
3
  var style = document.createElement('style');
4
4
  style.setAttribute('type', 'text/css');
@@ -3,13 +3,18 @@ import { useState, useEffect, useRef, useMemo } from 'react';
3
3
  import { useNodesState, useEdgesState, ReactFlow, ConnectionLineType, Background, Controls } from '@xyflow/react';
4
4
  import '@xyflow/react/dist/style.css';
5
5
  import { motion, AnimatePresence } from 'framer-motion';
6
- import { Cpu, Search, RefreshCcw, Minimize2, Maximize2, PanelRightClose, PanelRight, X, Database, Activity } from 'lucide-react';
6
+ import { Cpu, Network, GitBranch, Search, RefreshCcw, Minimize2, Maximize2, PanelRightClose, PanelRight, X, Database, Activity } from 'lucide-react';
7
7
  import './MentalMap.css.js';
8
- import { FiberEdge, ActorNode, FlowNode } from './MapUtils.js';
8
+ import { ListenerNode, ActorNode, FlowNode } from './mmap/components/FlowNodes.js';
9
+ import { FiberEdge } from './MapUtils.js';
10
+ import { MMapSidebar } from './mmap/components/MMapSidebar.js';
11
+ import { MMapLedger } from './mmap/components/MMapLedger.js';
12
+ import { FlowGenealogy } from './mmap/components/FlowGenealogy.js';
9
13
 
10
14
  const nodeTypes = {
11
15
  flow: FlowNode,
12
16
  actor: ActorNode,
17
+ listener: ListenerNode,
13
18
  };
14
19
  const edgeTypes = {
15
20
  fiber: FiberEdge,
@@ -23,10 +28,11 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
23
28
  const [isMinimized, setIsMinimized] = useState(false);
24
29
  const [isFullscreen, setIsFullscreen] = useState(false);
25
30
  const [isLedgerVisible, setIsLedgerVisible] = useState(true);
31
+ const [viewMode, setViewMode] = useState("live");
26
32
  useEffect(() => {
27
33
  onMinimizeChange?.(isMinimized);
28
34
  }, [isMinimized, onMinimizeChange]);
29
- // Dragging logic for minimized state
35
+ // Logic pour le drag du logo réduit
30
36
  const [minimizedPos, setMinimizedPos] = useState({
31
37
  x: minimizedSide === "right" ? window.innerWidth - 100 : 40,
32
38
  y: window.innerHeight - 100,
@@ -68,112 +74,177 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
68
74
  window.removeEventListener("mouseup", handleMouseUp);
69
75
  };
70
76
  }, [isDraggingLogo, dragOffset]);
71
- // Track flows that changed recently
72
77
  const [activeFlows, setActiveFlows] = useState(new Set());
73
- useEffect(() => {
78
+ // Detect recent activity
79
+ const recentActivity = useMemo(() => {
74
80
  const now = Date.now();
75
- const active = new Set();
81
+ const activityMap = {};
76
82
  Object.entries(snapshot).forEach(([key, data]) => {
77
83
  const traces = data.meta.traces || [];
78
- const hasRecent = traces.some((t) => now - t.timestamp < 3000);
79
- if (hasRecent)
80
- active.add(key);
84
+ const lastTrace = traces[traces.length - 1];
85
+ if (lastTrace && now - lastTrace.timestamp < 1000) {
86
+ activityMap[key] = {
87
+ active: true,
88
+ actor: lastTrace.actor,
89
+ type: lastTrace.type,
90
+ };
91
+ }
81
92
  });
82
- setActiveFlows(active);
93
+ return activityMap;
83
94
  }, [snapshot]);
84
- // Filter flows based on search query (Smart Search: Key, Actors, Data)
95
+ useEffect(() => {
96
+ const active = new Set();
97
+ Object.keys(recentActivity).forEach((key) => active.add(key));
98
+ setActiveFlows(active);
99
+ }, [recentActivity]);
85
100
  const filteredFlows = useMemo(() => {
86
101
  const query = searchQuery.toLowerCase().trim();
102
+ const entries = Object.entries(snapshot);
87
103
  if (!query)
88
- return Object.entries(snapshot);
89
- return Object.entries(snapshot).filter(([key, data]) => {
90
- // 1. Match Flow Name
104
+ return entries;
105
+ return entries.filter(([key, data]) => {
91
106
  if (key.toLowerCase().includes(query))
92
107
  return true;
93
- // 2. Match Actors (Consumers)
94
108
  const consumers = data.meta.consumers || [];
95
109
  if (consumers.some((c) => c.toLowerCase().includes(query)))
96
110
  return true;
97
- // 3. Match Data (Values)
98
111
  try {
99
112
  if (JSON.stringify(data.value).toLowerCase().includes(query))
100
113
  return true;
101
114
  }
102
- catch (e) {
103
- // ignore circular structure issues
104
- }
115
+ catch (e) { }
105
116
  return false;
106
117
  });
107
118
  }, [snapshot, searchQuery]);
108
- // Process data for React Flow
109
119
  useEffect(() => {
110
- // Use the filtered list for the map!
120
+ if (viewMode !== "live")
121
+ return;
111
122
  const flowEntries = filteredFlows;
112
123
  const newNodes = [];
113
124
  const newEdges = [];
114
- const actorsSeen = new Set();
115
- const flowX = 400;
116
125
  const actorX = 50;
126
+ const flowX = 500;
127
+ const listenerX = 950;
117
128
  let flowY = 100;
118
129
  let actorY = 100;
130
+ let listenerY = 100;
119
131
  flowEntries.forEach(([key, data]) => {
132
+ const activity = recentActivity[key];
133
+ const isFlowHot = !!activity;
134
+ // --- Node FLOW (Center) ---
120
135
  newNodes.push({
121
136
  id: `flow-${key}`,
122
137
  type: "flow",
123
138
  position: { x: flowX, y: flowY },
124
139
  data: {
125
- label: key,
140
+ label: key.toUpperCase(),
126
141
  value: data.value,
127
142
  isActive: selectedFlow === key,
143
+ isHot: isFlowHot,
128
144
  onClick: () => setOverlayFlow(key),
129
145
  },
130
146
  });
131
- const consumers = data.meta.consumers || [];
132
- consumers.forEach((actorName) => {
133
- if (!actorName)
134
- return;
135
- const actorId = `actor-${actorName}`;
136
- if (!actorsSeen.has(actorId)) {
137
- newNodes.push({
138
- id: actorId,
139
- type: "actor",
140
- position: { x: actorX, y: actorY },
141
- data: {
142
- label: actorName,
143
- isActive: selectedFlow === key,
144
- },
145
- });
146
- actorsSeen.add(actorId);
147
- actorY += 100;
147
+ // Split Listeners: Named (Actors) vs Anonymous (UI)
148
+ const rawListeners = data.meta.listeners || [];
149
+ const namedActors = [];
150
+ const uiListeners = [];
151
+ rawListeners.forEach((l) => {
152
+ const isUI = l.label.startsWith("useFlow(") || l.label === "Anonymous Subscriber";
153
+ if (isUI)
154
+ uiListeners.push(l);
155
+ else
156
+ namedActors.push(l);
157
+ });
158
+ // Mix in the explicit consumers (those who wrote in the past)
159
+ const explicitConsumers = data.meta.consumers || [];
160
+ explicitConsumers.forEach((name) => {
161
+ if (!namedActors.find((a) => a.label === name)) {
162
+ namedActors.push({ label: name, isExplicit: true });
148
163
  }
164
+ });
165
+ // --- Node ACTORS (Left) ---
166
+ namedActors.forEach((actor, i) => {
167
+ const actorId = `actor-${actor.label}-${key}`;
168
+ const isActorHot = isFlowHot && activity.actor === actor.label;
169
+ newNodes.push({
170
+ id: actorId,
171
+ type: "actor",
172
+ position: { x: actorX, y: actorY },
173
+ data: {
174
+ label: actor.label,
175
+ isActive: selectedFlow === key,
176
+ isHot: isActorHot,
177
+ },
178
+ });
149
179
  newEdges.push({
150
- id: `edge-${actorName}-${key}`,
180
+ id: `edge-${actor.label}-${key}`,
151
181
  source: actorId,
152
182
  target: `flow-${key}`,
183
+ targetHandle: "actor-target",
153
184
  type: "fiber",
154
185
  animated: true,
186
+ style: {
187
+ stroke: isActorHot ? "#fbbf24" : "#a855f7",
188
+ strokeWidth: isActorHot ? 4 : 2,
189
+ },
155
190
  });
191
+ actorY += 120;
156
192
  });
157
- flowY += 180;
193
+ // --- Node UI LISTENERS (Right) ---
194
+ // Group UI Listeners by label to avoid redundancy
195
+ const groupedUI = uiListeners.reduce((acc, curr) => {
196
+ if (!acc[curr.label]) {
197
+ acc[curr.label] = { ...curr, count: 0 };
198
+ }
199
+ acc[curr.label].count += 1;
200
+ return acc;
201
+ }, {});
202
+ Object.values(groupedUI).forEach((group, i) => {
203
+ const listenerId = `listener-${key}-${group.label}`;
204
+ const isListenerHot = isFlowHot && (activity.type === "read" || activity.type === "write");
205
+ newNodes.push({
206
+ id: listenerId,
207
+ type: "listener",
208
+ position: { x: listenerX, y: listenerY },
209
+ data: {
210
+ label: group.count > 1
211
+ ? `${group.label} (x${group.count})`
212
+ : group.label,
213
+ isActive: selectedFlow === key,
214
+ isHot: isListenerHot,
215
+ },
216
+ });
217
+ newEdges.push({
218
+ id: `edge-flow-listener-${key}-${group.label}`,
219
+ source: `flow-${key}`,
220
+ sourceHandle: "listener-source",
221
+ target: listenerId,
222
+ type: "fiber",
223
+ animated: true,
224
+ style: {
225
+ stroke: isListenerHot ? "#fbbf24" : "#00d4ff",
226
+ strokeWidth: isListenerHot ? 3 : 2,
227
+ },
228
+ });
229
+ listenerY += 100;
230
+ });
231
+ const maxRowHeight = Math.max(250, namedActors.length * 120, Object.keys(groupedUI).length * 100);
232
+ flowY += maxRowHeight + 50;
233
+ if (actorY < flowY)
234
+ actorY = flowY;
235
+ if (listenerY < flowY)
236
+ listenerY = flowY;
158
237
  });
159
238
  setNodes(newNodes);
160
239
  setEdges(newEdges);
161
- }, [filteredFlows, selectedFlow, setNodes, setEdges]);
162
- // --- Handlers ---
163
- const handleRefresh = () => {
164
- // Simple way to trigger re-layout or re-fetch (already handled by snapshot prop)
165
- window.location.reload();
166
- };
167
- const toggleFullscreen = () => {
168
- if (!document.fullscreenElement) {
169
- document.documentElement.requestFullscreen();
170
- setIsFullscreen(true);
171
- }
172
- else {
173
- document.exitFullscreen();
174
- setIsFullscreen(false);
175
- }
176
- };
240
+ }, [
241
+ filteredFlows,
242
+ selectedFlow,
243
+ viewMode,
244
+ recentActivity,
245
+ setNodes,
246
+ setEdges,
247
+ ]);
177
248
  return (jsx(motion.div, { className: "mental-map-overlay", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, children: jsxs("div", { className: `mental-map-container ${isMinimized ? "minimized" : ""}`, style: isMinimized
178
249
  ? {
179
250
  left: minimizedPos.x,
@@ -182,36 +253,26 @@ const MentalMap = ({ snapshot, onClose, onMinimizeChange, minimizedSide = "right
182
253
  right: "auto",
183
254
  }
184
255
  : {}, onMouseDown: handleLogoMouseDown, onClick: () => {
185
- if (!wasDragged.current && isMinimized) {
256
+ if (!wasDragged.current && isMinimized)
186
257
  setIsMinimized(false);
187
- }
188
- }, children: [jsxs("div", { className: `m2-minimized-logo ${activeFlows.size > 0 ? "pulse" : ""}`, children: ["F", jsx("span", { className: "m2-minimized-badge", children: "FTE" })] }), jsxs("header", { className: "m2-header", children: [jsxs("div", { className: "m2-logo-group", children: [jsx("div", { className: "m2-logo-icon", children: jsx(Cpu, { color: "white", size: 28 }) }), jsxs("div", { className: "m2-header-titles", children: [jsx("h1", { children: "Mental Map & Trace Engine" }), jsxs("div", { className: "m2-header-meta", children: [jsx("span", { className: "m2-engine-badge", children: "FM2/FTE5" }), jsx("span", { style: { fontSize: 10, opacity: 0.5, fontWeight: 700 }, children: "NEHONIX FCE" })] })] })] }), jsxs("div", { className: "m2-controls", children: [jsxs("div", { className: "m2-search-wrapper", children: [jsx(Search, { className: "m2-search-icon", size: 18 }), jsx("input", { type: "text", className: "m2-search-input", placeholder: "Search flows, actors or data patterns...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }), jsxs("div", { className: "m2-action-btns", children: [jsx("button", { className: "m2-icon-btn", title: "Refresh Graph", onClick: handleRefresh, children: jsx(RefreshCcw, { size: 20 }) }), jsx("button", { className: "m2-icon-btn", title: "Minimize", onClick: (e) => {
258
+ }, children: [jsxs("div", { className: `m2-minimized-logo ${activeFlows.size > 0 ? "pulse" : ""}`, children: ["F", jsx("span", { className: "m2-minimized-badge", children: "FTE" })] }), jsxs("header", { className: "m2-header", children: [jsxs("div", { className: "m2-logo-group", children: [jsx("div", { className: "m2-logo-icon", children: jsx(Cpu, { color: "white", size: 28 }) }), jsxs("div", { className: "m2-header-titles", children: [jsx("h1", { children: "Mental Map & Trace Engine" }), jsxs("div", { className: "m2-header-meta", children: [jsx("span", { className: "m2-engine-badge", children: "FM2/FTE5" }), jsx("span", { style: { fontSize: 10, opacity: 0.5, fontWeight: 700 }, children: "NEHONIX FCE" })] })] })] }), jsxs("div", { className: "m2-controls", children: [jsxs("div", { className: "m2-view-switcher", style: { display: "flex", gap: 8, marginRight: 16 }, children: [jsxs("button", { className: `view-toggle-btn ${viewMode === "live" ? "active" : ""}`, onClick: () => setViewMode("live"), children: [jsx(Network, { size: 16 }), " Live Graph"] }), jsxs("button", { className: `view-toggle-btn ${viewMode === "genealogy" ? "active" : ""}`, onClick: () => setViewMode("genealogy"), children: [jsx(GitBranch, { size: 16 }), " Genealogy"] })] }), jsxs("div", { className: "m2-search-wrapper", children: [jsx(Search, { className: "m2-search-icon", size: 18 }), jsx("input", { type: "text", className: "m2-search-input", placeholder: "Search flows, actors or data patterns...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value) })] }), jsxs("div", { className: "m2-action-btns", children: [jsx("button", { className: "m2-icon-btn", title: "Refresh", onClick: () => window.location.reload(), children: jsx(RefreshCcw, { size: 20 }) }), jsx("button", { className: "m2-icon-btn", title: "Minimize", style: { color: "blue" }, onClick: (e) => {
189
259
  e.stopPropagation();
190
260
  setIsMinimized(true);
191
261
  setIsOpen(false);
192
- }, children: jsx(Minimize2, { size: 20 }) }), jsx("button", { className: "m2-icon-btn", title: isFullscreen ? "Exit Fullscreen" : "Fullscreen", onClick: toggleFullscreen, children: isFullscreen ? (jsx(Minimize2, { size: 20 })) : (jsx(Maximize2, { size: 20 })) }), jsx("button", { className: "m2-icon-btn", title: isLedgerVisible ? "Hide Ledger" : "Show Ledger", onClick: () => setIsLedgerVisible(!isLedgerVisible), children: isLedgerVisible ? (jsx(PanelRightClose, { size: 20 })) : (jsx(PanelRight, { size: 20 })) }), jsx("button", { className: "m2-icon-btn m2-close-btn force-visible", onClick: (e) => {
262
+ }, children: jsx(Minimize2, { size: 20 }) }), jsx("button", { className: "m2-icon-btn", title: "Fullscreen", onClick: () => {
263
+ if (!document.fullscreenElement)
264
+ document.documentElement.requestFullscreen();
265
+ else
266
+ document.exitFullscreen();
267
+ }, children: jsx(Maximize2, { size: 20 }) }), jsx("button", { className: "m2-icon-btn", title: "Toggle Ledger", onClick: () => setIsLedgerVisible(!isLedgerVisible), children: isLedgerVisible ? (jsx(PanelRightClose, { size: 20 })) : (jsx(PanelRight, { size: 20 })) }), jsx("button", { className: "m2-icon-btn m2-close-btn force-visible", onClick: (e) => {
193
268
  e.stopPropagation();
194
269
  onClose();
195
- }, title: "Close", children: jsx(X, { size: 24 }) })] })] })] }), jsxs("div", { className: "m2-layout", children: [jsxs("aside", { className: "m2-sidebar", children: [jsx("div", { className: "m2-sec-header", children: "Flow System Registry" }), jsx("div", { className: "m2-list", children: jsx(AnimatePresence, { mode: "popLayout", children: filteredFlows.map(([key, data]) => {
196
- const isActiveNow = activeFlows.has(key);
197
- return (jsxs(motion.div, { layout: true, initial: { opacity: 0, x: -20 }, animate: { opacity: 1, x: 0 }, className: `m2-flow-card ${selectedFlow === key ? "active" : ""} ${isActiveNow ? "is-active-now" : ""}`, onClick: () => setSelectedFlow(key), children: [jsx("div", { className: "m2-flow-indicator" }), jsxs("div", { className: "m2-flow-info", children: [jsx("span", { className: "m2-flow-name", children: key }), jsxs("span", { className: "m2-flow-stats", children: [data.meta.traces.length, " events \u2022", " ", data.meta.listeners, " listeners"] })] })] }, key));
198
- }) }) })] }), jsx("main", { className: "m2-canvas", children: jsxs(ReactFlow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: ConnectionLineType.Bezier, onNodeClick: (_, node) => {
270
+ }, title: "Close", children: jsx(X, { size: 24 }) })] })] })] }), jsxs("div", { className: "m2-layout", children: [jsx(MMapSidebar, { filteredFlows: filteredFlows, selectedFlow: selectedFlow, setSelectedFlow: setSelectedFlow, activeFlows: activeFlows }), jsx("main", { className: "m2-canvas", children: viewMode === "live" ? (jsxs(ReactFlow, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onEdgesChange: onEdgesChange, nodeTypes: nodeTypes, edgeTypes: edgeTypes, connectionLineType: ConnectionLineType.Bezier, onNodeClick: (_, node) => {
199
271
  if (node.type === "flow")
200
272
  setOverlayFlow(node.id.replace("flow-", ""));
201
- }, fitView: true, colorMode: "dark", children: [jsx(Background, { color: "#1e293b", gap: 20 }), jsx(Controls, { showInteractive: false })] }) }), jsxs("aside", { className: `m2-ledger ${!isLedgerVisible ? "hidden" : ""}`, children: [jsxs("div", { className: "m2-ledger-controls", children: [jsx("div", { className: "m2-ledger-title", children: "Activity Trace Ledger (Real-time)" }), jsx("div", { className: "m2-filter-tabs", children: jsx("div", { className: "m2-tab active", children: "REAL-TIME EXECUTION" }) })] }), jsx("div", { className: "m2-trace-list", children: jsx(AnimatePresence, { mode: "popLayout", children: selectedFlow
202
- ? [...snapshot[selectedFlow].meta.traces]
203
- .reverse()
204
- .map((trace, i) => (jsxs(motion.div, { layout: true, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsx("div", { className: "m2-trace-dot" }), jsxs("div", { className: "m2-trace-header", children: [jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsxs("div", { className: "m2-trace-op-info", children: [jsx("span", { className: "m2-op-type", children: trace.type }), trace.path && (jsx("span", { className: "m2-path-tag", children: trace.path.join(" → ") }))] }), jsx("div", { className: "m2-trace-data", children: jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, `${selectedFlow}-${i}`)))
205
- : Object.entries(snapshot)
206
- .flatMap(([key, data]) => (data.meta.traces || []).map((t) => ({
207
- ...t,
208
- flow: key,
209
- })))
210
- .sort((a, b) => b.timestamp - a.timestamp)
211
- .slice(0, 50)
212
- .map((trace, i) => (jsxs(motion.div, { layout: true, initial: { opacity: 0, y: 10 }, animate: { opacity: 1, y: 0 }, className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsx("div", { className: "m2-trace-dot" }), jsxs("div", { className: "m2-trace-header", children: [jsxs("span", { className: "m2-trace-actor-lbl", children: [jsxs("span", { style: { color: "var(--m2-accent-cyan)" }, children: ["[", trace.flow, "]"] }), " ", trace.actor] }), jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsx("div", { className: "m2-trace-op-info", children: jsx("span", { className: "m2-op-type", children: trace.type }) }), jsx("div", { className: "m2-trace-data", children: jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, `global-${i}`))) }) })] })] }), jsx(AnimatePresence, { children: overlayFlow && (jsx(motion.div, { className: "m2-flow-overlay-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: () => setOverlayFlow(null), children: jsxs(motion.div, { className: "m2-flow-overlay", onClick: (e) => e.stopPropagation(), layoutId: `flow-${overlayFlow}`, children: [jsxs("div", { className: "m2-overlay-header", children: [jsxs("div", { className: "m2-overlay-title", children: [jsx(Database, { color: "#00d4ff", size: 24 }), jsxs("h2", { children: [overlayFlow, " Activity"] })] }), jsx("button", { className: "m2-icon-btn m2-close-btn", onClick: () => setOverlayFlow(null), children: jsx(X, { size: 20 }) })] }), jsx("div", { className: "m2-overlay-content", children: snapshot[overlayFlow].meta.traces.length === 0 ? (jsxs("div", { className: "m2-empty-state", children: [jsx(Activity, { size: 48, className: "m2-empty-icon" }), jsx("h3", { children: "No Activity Detected" }), jsxs("p", { children: ["This flow hasn't emitted any events yet. Interact with the features controlled by", " ", jsx("strong", { children: overlayFlow }), " to see real-time traces here."] })] })) : (jsx("div", { className: "m2-trace-list", style: { padding: 0 }, children: [...snapshot[overlayFlow].meta.traces]
273
+ }, fitView: true, colorMode: "dark", children: [jsx(Background, { color: "#1e293b", gap: 20 }), " ", jsx(Controls, { showInteractive: false })] })) : (jsx(FlowGenealogy, { snapshot: snapshot, onSelectFlow: setOverlayFlow })) }), jsx(MMapLedger, { snapshot: snapshot, selectedFlow: selectedFlow, isLedgerVisible: isLedgerVisible })] }), jsx(AnimatePresence, { children: overlayFlow && (jsx(motion.div, { className: "m2-flow-overlay-backdrop", initial: { opacity: 0 }, animate: { opacity: 1 }, exit: { opacity: 0 }, onClick: () => setOverlayFlow(null), children: jsxs("div", { className: "m2-flow-overlay", onClick: (e) => e.stopPropagation(), children: [jsxs("div", { className: "m2-overlay-header", children: [jsxs("div", { className: "m2-overlay-title", children: [jsx(Database, { color: "#00d4ff", size: 24 }), jsxs("h2", { children: [overlayFlow, " Activity"] })] }), jsx("button", { className: "m2-icon-btn m2-close-btn", onClick: () => setOverlayFlow(null), children: jsx(X, { size: 20 }) })] }), jsx("div", { className: "m2-overlay-content", children: snapshot[overlayFlow].meta.traces.length === 0 ? (jsxs("div", { className: "m2-empty-state", children: [jsx(Activity, { size: 48, className: "m2-empty-icon" }), jsx("h3", { children: "No Activity Detected" }), jsx("p", { children: "This flow hasn't emitted any events yet." })] })) : (jsx("div", { className: "m2-trace-list", children: [...snapshot[overlayFlow].meta.traces]
213
274
  .reverse()
214
- .map((trace, i) => (jsxs("div", { className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsx("div", { className: "m2-trace-dot" }), jsxs("div", { className: "m2-trace-header", children: [jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsx("div", { className: "m2-trace-op-info", children: jsx("span", { className: "m2-op-type", children: trace.type }) }), jsx("div", { className: "m2-trace-data", children: jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, i))) })) })] }) }, "overlay-backdrop")) })] }) }));
275
+ .map((trace, i) => (jsxs("div", { className: `m2-trace-card ${trace.type === "reset" ? "reset" : ""}`, children: [jsx("div", { className: "m2-trace-dot" }), jsxs("div", { className: "m2-trace-header", children: [jsx("span", { className: "m2-trace-actor-lbl", children: trace.actor }), jsx("span", { className: "m2-trace-ts", children: new Date(trace.timestamp).toLocaleTimeString() })] }), jsx("div", { className: "m2-trace-op-info", children: jsx("span", { className: "m2-op-type", children: trace.type }) }), jsx("div", { className: "m2-trace-data", children: jsx("pre", { className: "m2-trace-json", children: JSON.stringify(trace.value, null, 2) }) })] }, i))) })) })] }) })) })] }) }));
215
276
  };
216
277
 
217
278
  export { MentalMap };
@@ -1 +1 @@
1
- {"version":3,"file":"MentalMap.js","sources":["../../../../src/devtools/MentalMap.tsx"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Edge,\n Node,\n useNodesState,\n useEdgesState,\n ConnectionLineType,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Database,\n Search,\n X,\n RefreshCcw,\n Maximize2,\n Cpu,\n Minimize2,\n PanelRightClose,\n PanelRight,\n Activity,\n} from \"lucide-react\";\nimport \"./MentalMap.css\";\nimport { MentalMapProps } from \"./MentalMapProps\";\nimport { FlowNode, ActorNode, FiberEdge } from \"./MapUtils\";\n\nconst nodeTypes = {\n flow: FlowNode,\n actor: ActorNode,\n};\n\nconst edgeTypes = {\n fiber: FiberEdge,\n};\n\nexport const MentalMap = ({\n snapshot,\n onClose,\n onMinimizeChange,\n minimizedSide = \"right\",\n setIsOpen,\n}: MentalMapProps) => {\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [selectedFlow, setSelectedFlow] = useState<string | null>(null);\n const [overlayFlow, setOverlayFlow] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isMinimized, setIsMinimized] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLedgerVisible, setIsLedgerVisible] = useState(true);\n\n useEffect(() => {\n onMinimizeChange?.(isMinimized);\n }, [isMinimized, onMinimizeChange]);\n\n // Dragging logic for minimized state\n const [minimizedPos, setMinimizedPos] = useState({\n x: minimizedSide === \"right\" ? window.innerWidth - 100 : 40,\n y: window.innerHeight - 100,\n });\n const [isDraggingLogo, setIsDraggingLogo] = useState(false);\n const wasDragged = useRef(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n\n const handleLogoMouseDown = (e: React.MouseEvent) => {\n if (!isMinimized) return;\n setIsDraggingLogo(true);\n wasDragged.current = false;\n setDragOffset({\n x: e.clientX - minimizedPos.x,\n y: e.clientY - minimizedPos.y,\n });\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingLogo) {\n wasDragged.current = true;\n setMinimizedPos({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n });\n }\n };\n const handleMouseUp = () => {\n setTimeout(() => {\n setIsDraggingLogo(false);\n }, 0);\n };\n\n if (isDraggingLogo) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDraggingLogo, dragOffset]);\n\n // Track flows that changed recently\n const [activeFlows, setActiveFlows] = useState<Set<string>>(new Set());\n\n useEffect(() => {\n const now = Date.now();\n const active = new Set<string>();\n Object.entries(snapshot).forEach(([key, data]) => {\n const traces = data.meta.traces || [];\n const hasRecent = traces.some((t: any) => now - t.timestamp < 3000);\n if (hasRecent) active.add(key);\n });\n setActiveFlows(active);\n }, [snapshot]);\n\n // Filter flows based on search query (Smart Search: Key, Actors, Data)\n const filteredFlows = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n if (!query) return Object.entries(snapshot);\n\n return Object.entries(snapshot).filter(([key, data]) => {\n // 1. Match Flow Name\n if (key.toLowerCase().includes(query)) return true;\n\n // 2. Match Actors (Consumers)\n const consumers = data.meta.consumers || [];\n if (consumers.some((c: any) => c.toLowerCase().includes(query)))\n return true;\n\n // 3. Match Data (Values)\n try {\n if (JSON.stringify(data.value).toLowerCase().includes(query))\n return true;\n } catch (e) {\n // ignore circular structure issues\n }\n\n return false;\n });\n }, [snapshot, searchQuery]);\n\n // Process data for React Flow\n useEffect(() => {\n // Use the filtered list for the map!\n const flowEntries = filteredFlows;\n const newNodes: Node[] = [];\n const newEdges: Edge[] = [];\n const actorsSeen = new Set<string>();\n\n const flowX = 400;\n const actorX = 50;\n let flowY = 100;\n let actorY = 100;\n\n flowEntries.forEach(([key, data]) => {\n newNodes.push({\n id: `flow-${key}`,\n type: \"flow\",\n position: { x: flowX, y: flowY },\n data: {\n label: key,\n value: data.value,\n isActive: selectedFlow === key,\n onClick: () => setOverlayFlow(key),\n },\n });\n\n const consumers = data.meta.consumers || [];\n consumers.forEach((actorName: string) => {\n if (!actorName) return;\n\n const actorId = `actor-${actorName}`;\n if (!actorsSeen.has(actorId)) {\n newNodes.push({\n id: actorId,\n type: \"actor\",\n position: { x: actorX, y: actorY },\n data: {\n label: actorName,\n isActive: selectedFlow === key,\n },\n });\n actorsSeen.add(actorId);\n actorY += 100;\n }\n\n newEdges.push({\n id: `edge-${actorName}-${key}`,\n source: actorId,\n target: `flow-${key}`,\n type: \"fiber\",\n animated: true,\n });\n });\n\n flowY += 180;\n });\n\n setNodes(newNodes);\n setEdges(newEdges);\n }, [filteredFlows, selectedFlow, setNodes, setEdges]);\n\n // --- Handlers ---\n const handleRefresh = () => {\n // Simple way to trigger re-layout or re-fetch (already handled by snapshot prop)\n window.location.reload();\n };\n\n const toggleFullscreen = () => {\n if (!document.fullscreenElement) {\n document.documentElement.requestFullscreen();\n setIsFullscreen(true);\n } else {\n document.exitFullscreen();\n setIsFullscreen(false);\n }\n };\n\n return (\n <motion.div\n className=\"mental-map-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n >\n <div\n className={`mental-map-container ${isMinimized ? \"minimized\" : \"\"}`}\n style={\n isMinimized\n ? {\n left: minimizedPos.x,\n top: minimizedPos.y,\n bottom: \"auto\",\n right: \"auto\",\n }\n : {}\n }\n onMouseDown={handleLogoMouseDown}\n onClick={() => {\n if (!wasDragged.current && isMinimized) {\n setIsMinimized(false);\n }\n }}\n >\n {/* --- Minimized Logo --- */}\n <div\n className={`m2-minimized-logo ${activeFlows.size > 0 ? \"pulse\" : \"\"}`}\n >\n F<span className=\"m2-minimized-badge\">FTE</span>\n </div>\n\n {/* --- Header --- */}\n <header className=\"m2-header\">\n <div className=\"m2-logo-group\">\n <div className=\"m2-logo-icon\">\n <Cpu color=\"white\" size={28} />\n </div>\n <div className=\"m2-header-titles\">\n <h1>Mental Map & Trace Engine</h1>\n <div className=\"m2-header-meta\">\n <span className=\"m2-engine-badge\">FM2/FTE5</span>\n <span style={{ fontSize: 10, opacity: 0.5, fontWeight: 700 }}>\n NEHONIX FCE\n {/* NEHONIX FCE = NEHONIX FractoCore Engine */}\n </span>\n </div>\n </div>\n </div>\n\n <div className=\"m2-controls\">\n <div className=\"m2-search-wrapper\">\n <Search className=\"m2-search-icon\" size={18} />\n <input\n type=\"text\"\n className=\"m2-search-input\"\n placeholder=\"Search flows, actors or data patterns...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n <div className=\"m2-action-btns\">\n <button\n className=\"m2-icon-btn\"\n title=\"Refresh Graph\"\n onClick={handleRefresh}\n >\n <RefreshCcw size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Minimize\"\n onClick={(e) => {\n e.stopPropagation();\n setIsMinimized(true);\n setIsOpen(false);\n }}\n >\n <Minimize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title={isFullscreen ? \"Exit Fullscreen\" : \"Fullscreen\"}\n onClick={toggleFullscreen}\n >\n {isFullscreen ? (\n <Minimize2 size={20} />\n ) : (\n <Maximize2 size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn\"\n title={isLedgerVisible ? \"Hide Ledger\" : \"Show Ledger\"}\n onClick={() => setIsLedgerVisible(!isLedgerVisible)}\n >\n {isLedgerVisible ? (\n <PanelRightClose size={20} />\n ) : (\n <PanelRight size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn m2-close-btn force-visible\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n title=\"Close\"\n >\n <X size={24} />\n </button>\n </div>\n </div>\n </header>\n\n <div className=\"m2-layout\">\n {/* --- Sidebar --- */}\n <aside className=\"m2-sidebar\">\n <div className=\"m2-sec-header\">Flow System Registry</div>\n <div className=\"m2-list\">\n <AnimatePresence mode=\"popLayout\">\n {filteredFlows.map(([key, data]) => {\n const isActiveNow = activeFlows.has(key);\n return (\n <motion.div\n key={key}\n layout\n initial={{ opacity: 0, x: -20 }}\n animate={{ opacity: 1, x: 0 }}\n className={`m2-flow-card ${selectedFlow === key ? \"active\" : \"\"} ${isActiveNow ? \"is-active-now\" : \"\"}`}\n onClick={() => setSelectedFlow(key)}\n >\n <div className=\"m2-flow-indicator\" />\n <div className=\"m2-flow-info\">\n <span className=\"m2-flow-name\">{key}</span>\n <span className=\"m2-flow-stats\">\n {data.meta.traces.length} events •{\" \"}\n {data.meta.listeners} listeners\n </span>\n </div>\n </motion.div>\n );\n })}\n </AnimatePresence>\n </div>\n </aside>\n\n {/* --- Main Canvas --- */}\n <main className=\"m2-canvas\">\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionLineType={ConnectionLineType.Bezier}\n onNodeClick={(_, node) => {\n if (node.type === \"flow\")\n setOverlayFlow(node.id.replace(\"flow-\", \"\"));\n }}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#1e293b\" gap={20} />\n <Controls showInteractive={false} />\n </ReactFlow>\n </main>\n\n {/* --- Activity Ledger --- */}\n <aside className={`m2-ledger ${!isLedgerVisible ? \"hidden\" : \"\"}`}>\n <div className=\"m2-ledger-controls\">\n <div className=\"m2-ledger-title\">\n Activity Trace Ledger (Real-time)\n </div>\n <div className=\"m2-filter-tabs\">\n <div className=\"m2-tab active\">REAL-TIME EXECUTION</div>\n </div>\n </div>\n\n <div className=\"m2-trace-list\">\n <AnimatePresence mode=\"popLayout\">\n {selectedFlow\n ? [...snapshot[selectedFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <motion.div\n key={`${selectedFlow}-${i}`}\n layout\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n {trace.path && (\n <span className=\"m2-path-tag\">\n {trace.path.join(\" → \")}\n </span>\n )}\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </motion.div>\n ))\n : Object.entries(snapshot)\n .flatMap(([key, data]) =>\n (data.meta.traces || []).map((t: any) => ({\n ...t,\n flow: key,\n })),\n )\n .sort((a, b) => b.timestamp - a.timestamp)\n .slice(0, 50)\n .map((trace, i) => (\n <motion.div\n key={`global-${i}`}\n layout\n initial={{ opacity: 0, y: 10 }}\n animate={{ opacity: 1, y: 0 }}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n <span style={{ color: \"var(--m2-accent-cyan)\" }}>\n [{trace.flow}]\n </span>{\" \"}\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n </aside>\n </div>\n\n {/* --- Flow Data Overlay --- */}\n <AnimatePresence>\n {overlayFlow && (\n <motion.div\n key=\"overlay-backdrop\"\n className=\"m2-flow-overlay-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={() => setOverlayFlow(null)}\n >\n <motion.div\n className=\"m2-flow-overlay\"\n onClick={(e) => e.stopPropagation()}\n layoutId={`flow-${overlayFlow}`}\n >\n <div className=\"m2-overlay-header\">\n <div className=\"m2-overlay-title\">\n <Database color=\"#00d4ff\" size={24} />\n <h2>{overlayFlow} Activity</h2>\n </div>\n <button\n className=\"m2-icon-btn m2-close-btn\"\n onClick={() => setOverlayFlow(null)}\n >\n <X size={20} />\n </button>\n </div>\n <div className=\"m2-overlay-content\">\n {snapshot[overlayFlow].meta.traces.length === 0 ? (\n <div className=\"m2-empty-state\">\n <Activity size={48} className=\"m2-empty-icon\" />\n <h3>No Activity Detected</h3>\n <p>\n This flow hasn't emitted any events yet. Interact with\n the features controlled by{\" \"}\n <strong>{overlayFlow}</strong> to see real-time traces\n here.\n </p>\n </div>\n ) : (\n <div className=\"m2-trace-list\" style={{ padding: 0 }}>\n {[...snapshot[overlayFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <div\n key={i}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </motion.div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"MentalMap.js","sources":["../../../../src/devtools/MentalMap.tsx"],"sourcesContent":["import { useMemo, useState, useEffect, useRef } from \"react\";\nimport {\n ReactFlow,\n Background,\n Controls,\n Edge,\n Node,\n useNodesState,\n useEdgesState,\n ConnectionLineType,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport { motion, AnimatePresence } from \"framer-motion\";\nimport {\n Database,\n Search,\n X,\n RefreshCcw,\n Maximize2,\n Cpu,\n Minimize2,\n PanelRightClose,\n PanelRight,\n Activity,\n GitBranch,\n Network,\n} from \"lucide-react\";\nimport \"./MentalMap.css\";\nimport { MMapProps } from \"./mmap/MMapTypes\";\nimport { FlowNode, ActorNode, ListenerNode } from \"./mmap/components/FlowNodes\";\nimport { FiberEdge } from \"./MapUtils\";\nimport { MMapSidebar } from \"./mmap/components/MMapSidebar\";\nimport { MMapLedger } from \"./mmap/components/MMapLedger\";\nimport { FlowGenealogy } from \"./mmap/components/FlowGenealogy\";\n\nconst nodeTypes = {\n flow: FlowNode,\n actor: ActorNode,\n listener: ListenerNode,\n};\n\nconst edgeTypes = {\n fiber: FiberEdge,\n};\n\nexport const MentalMap = ({\n snapshot,\n onClose,\n onMinimizeChange,\n minimizedSide = \"right\",\n setIsOpen,\n}: MMapProps) => {\n const [nodes, setNodes, onNodesChange] = useNodesState<Node>([]);\n const [edges, setEdges, onEdgesChange] = useEdgesState<Edge>([]);\n const [selectedFlow, setSelectedFlow] = useState<string | null>(null);\n const [overlayFlow, setOverlayFlow] = useState<string | null>(null);\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [isMinimized, setIsMinimized] = useState(false);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const [isLedgerVisible, setIsLedgerVisible] = useState(true);\n const [viewMode, setViewMode] = useState<\"live\" | \"genealogy\">(\"live\");\n\n useEffect(() => {\n onMinimizeChange?.(isMinimized);\n }, [isMinimized, onMinimizeChange]);\n\n // Logic pour le drag du logo réduit\n const [minimizedPos, setMinimizedPos] = useState({\n x: minimizedSide === \"right\" ? window.innerWidth - 100 : 40,\n y: window.innerHeight - 100,\n });\n const [isDraggingLogo, setIsDraggingLogo] = useState(false);\n const wasDragged = useRef(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n\n const handleLogoMouseDown = (e: React.MouseEvent) => {\n if (!isMinimized) return;\n setIsDraggingLogo(true);\n wasDragged.current = false;\n setDragOffset({\n x: e.clientX - minimizedPos.x,\n y: e.clientY - minimizedPos.y,\n });\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n if (isDraggingLogo) {\n wasDragged.current = true;\n setMinimizedPos({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n });\n }\n };\n const handleMouseUp = () => {\n setTimeout(() => {\n setIsDraggingLogo(false);\n }, 0);\n };\n\n if (isDraggingLogo) {\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"mouseup\", handleMouseUp);\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"mouseup\", handleMouseUp);\n };\n }, [isDraggingLogo, dragOffset]);\n\n const [activeFlows, setActiveFlows] = useState<Set<string>>(new Set());\n\n // Detect recent activity\n const recentActivity = useMemo(() => {\n const now = Date.now();\n const activityMap: Record<\n string,\n { active: boolean; actor?: string; type?: string }\n > = {};\n\n Object.entries(snapshot).forEach(([key, data]) => {\n const traces = data.meta.traces || [];\n const lastTrace = traces[traces.length - 1];\n if (lastTrace && now - lastTrace.timestamp < 1000) {\n activityMap[key] = {\n active: true,\n actor: lastTrace.actor,\n type: lastTrace.type,\n };\n }\n });\n return activityMap;\n }, [snapshot]);\n\n useEffect(() => {\n const active = new Set<string>();\n Object.keys(recentActivity).forEach((key) => active.add(key));\n setActiveFlows(active);\n }, [recentActivity]);\n\n const filteredFlows = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const entries = Object.entries(snapshot);\n if (!query) return entries;\n\n return entries.filter(([key, data]) => {\n if (key.toLowerCase().includes(query)) return true;\n const consumers = data.meta.consumers || [];\n if (consumers.some((c: any) => c.toLowerCase().includes(query)))\n return true;\n try {\n if (JSON.stringify(data.value).toLowerCase().includes(query))\n return true;\n } catch (e) {}\n return false;\n });\n }, [snapshot, searchQuery]);\n\n useEffect(() => {\n if (viewMode !== \"live\") return;\n\n const flowEntries = filteredFlows;\n const newNodes: Node[] = [];\n const newEdges: Edge[] = [];\n\n const actorX = 50;\n const flowX = 500;\n const listenerX = 950;\n\n let flowY = 100;\n let actorY = 100;\n let listenerY = 100;\n\n flowEntries.forEach(([key, data]) => {\n const activity = recentActivity[key];\n const isFlowHot = !!activity;\n\n // --- Node FLOW (Center) ---\n newNodes.push({\n id: `flow-${key}`,\n type: \"flow\",\n position: { x: flowX, y: flowY },\n data: {\n label: key.toUpperCase(),\n value: data.value,\n isActive: selectedFlow === key,\n isHot: isFlowHot,\n onClick: () => setOverlayFlow(key),\n },\n });\n\n // Split Listeners: Named (Actors) vs Anonymous (UI)\n const rawListeners = data.meta.listeners || [];\n const namedActors: any[] = [];\n const uiListeners: any[] = [];\n\n rawListeners.forEach((l: any) => {\n const isUI =\n l.label.startsWith(\"useFlow(\") || l.label === \"Anonymous Subscriber\";\n if (isUI) uiListeners.push(l);\n else namedActors.push(l);\n });\n\n // Mix in the explicit consumers (those who wrote in the past)\n const explicitConsumers = data.meta.consumers || [];\n explicitConsumers.forEach((name: string) => {\n if (!namedActors.find((a) => a.label === name)) {\n namedActors.push({ label: name, isExplicit: true });\n }\n });\n\n // --- Node ACTORS (Left) ---\n namedActors.forEach((actor, i) => {\n const actorId = `actor-${actor.label}-${key}`;\n const isActorHot = isFlowHot && activity.actor === actor.label;\n\n newNodes.push({\n id: actorId,\n type: \"actor\",\n position: { x: actorX, y: actorY },\n data: {\n label: actor.label,\n isActive: selectedFlow === key,\n isHot: isActorHot,\n },\n });\n\n newEdges.push({\n id: `edge-${actor.label}-${key}`,\n source: actorId,\n target: `flow-${key}`,\n targetHandle: \"actor-target\",\n type: \"fiber\",\n animated: true,\n style: {\n stroke: isActorHot ? \"#fbbf24\" : \"#a855f7\",\n strokeWidth: isActorHot ? 4 : 2,\n },\n });\n\n actorY += 120;\n });\n\n // --- Node UI LISTENERS (Right) ---\n // Group UI Listeners by label to avoid redundancy\n const groupedUI = uiListeners.reduce((acc: any, curr: any) => {\n if (!acc[curr.label]) {\n acc[curr.label] = { ...curr, count: 0 };\n }\n acc[curr.label].count += 1;\n return acc;\n }, {});\n\n Object.values(groupedUI).forEach((group: any, i: number) => {\n const listenerId = `listener-${key}-${group.label}`;\n const isListenerHot =\n isFlowHot && (activity.type === \"read\" || activity.type === \"write\");\n\n newNodes.push({\n id: listenerId,\n type: \"listener\",\n position: { x: listenerX, y: listenerY },\n data: {\n label:\n group.count > 1\n ? `${group.label} (x${group.count})`\n : group.label,\n isActive: selectedFlow === key,\n isHot: isListenerHot,\n },\n });\n\n newEdges.push({\n id: `edge-flow-listener-${key}-${group.label}`,\n source: `flow-${key}`,\n sourceHandle: \"listener-source\",\n target: listenerId,\n type: \"fiber\",\n animated: true,\n style: {\n stroke: isListenerHot ? \"#fbbf24\" : \"#00d4ff\",\n strokeWidth: isListenerHot ? 3 : 2,\n },\n });\n\n listenerY += 100;\n });\n\n const maxRowHeight = Math.max(\n 250,\n namedActors.length * 120,\n Object.keys(groupedUI).length * 100,\n );\n flowY += maxRowHeight + 50;\n if (actorY < flowY) actorY = flowY;\n if (listenerY < flowY) listenerY = flowY;\n });\n\n setNodes(newNodes);\n setEdges(newEdges);\n }, [\n filteredFlows,\n selectedFlow,\n viewMode,\n recentActivity,\n setNodes,\n setEdges,\n ]);\n\n return (\n <motion.div\n className=\"mental-map-overlay\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n >\n {/* ... reste du header identique ... */}\n <div\n className={`mental-map-container ${isMinimized ? \"minimized\" : \"\"}`}\n style={\n isMinimized\n ? {\n left: minimizedPos.x,\n top: minimizedPos.y,\n bottom: \"auto\",\n right: \"auto\",\n }\n : {}\n }\n onMouseDown={handleLogoMouseDown}\n onClick={() => {\n if (!wasDragged.current && isMinimized) setIsMinimized(false);\n }}\n >\n <div\n className={`m2-minimized-logo ${activeFlows.size > 0 ? \"pulse\" : \"\"}`}\n >\n F<span className=\"m2-minimized-badge\">FTE</span>\n </div>\n\n <header className=\"m2-header\">\n <div className=\"m2-logo-group\">\n <div className=\"m2-logo-icon\">\n <Cpu color=\"white\" size={28} />\n </div>\n <div className=\"m2-header-titles\">\n <h1>Mental Map & Trace Engine</h1>\n <div className=\"m2-header-meta\">\n <span className=\"m2-engine-badge\">FM2/FTE5</span>\n <span style={{ fontSize: 10, opacity: 0.5, fontWeight: 700 }}>\n NEHONIX FCE\n </span>\n </div>\n </div>\n </div>\n <div className=\"m2-controls\">\n <div\n className=\"m2-view-switcher\"\n style={{ display: \"flex\", gap: 8, marginRight: 16 }}\n >\n <button\n className={`view-toggle-btn ${viewMode === \"live\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"live\")}\n >\n <Network size={16} /> Live Graph\n </button>\n <button\n className={`view-toggle-btn ${viewMode === \"genealogy\" ? \"active\" : \"\"}`}\n onClick={() => setViewMode(\"genealogy\")}\n >\n <GitBranch size={16} /> Genealogy\n </button>\n </div>\n <div className=\"m2-search-wrapper\">\n <Search className=\"m2-search-icon\" size={18} />\n <input\n type=\"text\"\n className=\"m2-search-input\"\n placeholder=\"Search flows, actors or data patterns...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n />\n </div>\n <div className=\"m2-action-btns\">\n <button\n className=\"m2-icon-btn\"\n title=\"Refresh\"\n onClick={() => window.location.reload()}\n >\n <RefreshCcw size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Minimize\"\n style={{color: \"blue\"}}\n\n onClick={(e) => {\n e.stopPropagation();\n setIsMinimized(true);\n setIsOpen(false);\n }}\n >\n <Minimize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Fullscreen\"\n onClick={() => {\n if (!document.fullscreenElement)\n document.documentElement.requestFullscreen();\n else document.exitFullscreen();\n }}\n >\n <Maximize2 size={20} />\n </button>\n <button\n className=\"m2-icon-btn\"\n title=\"Toggle Ledger\"\n onClick={() => setIsLedgerVisible(!isLedgerVisible)}\n >\n {isLedgerVisible ? (\n <PanelRightClose size={20} />\n ) : (\n <PanelRight size={20} />\n )}\n </button>\n <button\n className=\"m2-icon-btn m2-close-btn force-visible\"\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n title=\"Close\"\n >\n <X size={24} />\n </button>\n </div>\n </div>\n </header>\n\n <div className=\"m2-layout\">\n <MMapSidebar\n filteredFlows={filteredFlows}\n selectedFlow={selectedFlow}\n setSelectedFlow={setSelectedFlow}\n activeFlows={activeFlows}\n />\n <main className=\"m2-canvas\">\n {viewMode === \"live\" ? (\n <ReactFlow\n nodes={nodes}\n edges={edges}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n nodeTypes={nodeTypes}\n edgeTypes={edgeTypes}\n connectionLineType={ConnectionLineType.Bezier}\n onNodeClick={(_, node) => {\n if (node.type === \"flow\")\n setOverlayFlow(node.id.replace(\"flow-\", \"\"));\n }}\n fitView\n colorMode=\"dark\"\n >\n <Background color=\"#1e293b\" gap={20} />{\" \"}\n <Controls showInteractive={false} />\n </ReactFlow>\n ) : (\n <FlowGenealogy\n snapshot={snapshot}\n onSelectFlow={setOverlayFlow}\n />\n )}\n </main>\n <MMapLedger\n snapshot={snapshot}\n selectedFlow={selectedFlow}\n isLedgerVisible={isLedgerVisible}\n />\n </div>\n\n <AnimatePresence>\n {overlayFlow && (\n <motion.div\n className=\"m2-flow-overlay-backdrop\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n onClick={() => setOverlayFlow(null)}\n >\n <div\n className=\"m2-flow-overlay\"\n onClick={(e) => e.stopPropagation()}\n >\n <div className=\"m2-overlay-header\">\n <div className=\"m2-overlay-title\">\n <Database color=\"#00d4ff\" size={24} />\n <h2>{overlayFlow} Activity</h2>\n </div>\n <button\n className=\"m2-icon-btn m2-close-btn\"\n onClick={() => setOverlayFlow(null)}\n >\n <X size={20} />\n </button>\n </div>\n <div className=\"m2-overlay-content\">\n {snapshot[overlayFlow].meta.traces.length === 0 ? (\n <div className=\"m2-empty-state\">\n <Activity size={48} className=\"m2-empty-icon\" />\n <h3>No Activity Detected</h3>\n <p>This flow hasn't emitted any events yet.</p>\n </div>\n ) : (\n <div className=\"m2-trace-list\">\n {[...snapshot[overlayFlow].meta.traces]\n .reverse()\n .map((trace, i) => (\n <div\n key={i}\n className={`m2-trace-card ${trace.type === \"reset\" ? \"reset\" : \"\"}`}\n >\n <div className=\"m2-trace-dot\" />\n <div className=\"m2-trace-header\">\n <span className=\"m2-trace-actor-lbl\">\n {trace.actor}\n </span>\n <span className=\"m2-trace-ts\">\n {new Date(trace.timestamp).toLocaleTimeString()}\n </span>\n </div>\n <div className=\"m2-trace-op-info\">\n <span className=\"m2-op-type\">{trace.type}</span>\n </div>\n <div className=\"m2-trace-data\">\n <pre className=\"m2-trace-json\">\n {JSON.stringify(trace.value, null, 2)}\n </pre>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n </motion.div>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}