{"_id":"@agendocerto/flow-sdk","_rev":"2-d46d40365402e1e481c136a2743fafce","name":"@agendocerto/flow-sdk","dist-tags":{"latest":"0.4.0"},"versions":{"0.3.8":{"name":"@agendocerto/flow-sdk","version":"0.3.8","keywords":["react-flow","flow-editor","graph-editor","node-editor","zustand","typescript","react","state-management","event-driven"],"author":{"name":"AgendoCerto","email":"dev@agendocerto.com"},"license":"MIT","_id":"@agendocerto/flow-sdk@0.3.8","maintainers":[{"name":"agendocerto","email":"dev@agendocerto.com.br"}],"homepage":"https://github.com/AgendoCerto/flow-sdk#readme","bugs":{"url":"https://github.com/AgendoCerto/flow-sdk/issues"},"dist":{"shasum":"f679f0c120b9f5aad402bfbd3e8f0b67932863fc","tarball":"https://registry.npmjs.org/@agendocerto/flow-sdk/-/flow-sdk-0.3.8.tgz","fileCount":103,"integrity":"sha512-ZUIgwIyMQWcCGojh6hd6F0waTzkLwb/MU3gQHIl/MlsUXAii+r3StPn8QIbugJMG2jriLa2e4IunWL4Y/0o5aQ==","signatures":[{"sig":"MEQCIG/ksCUvmyQXPCW+GIajCdD7gTxq0s8kXckCJZMW3CKPAiAGC1PR0SD8RxFcXbAFJrYKJTUU32MOuslGuQIQh/BfYg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14464891},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"npm":">=9.0.0","node":">=18.0.0"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./styles.css":{"import":"./dist/style.css","require":"./dist/style.css"}},"gitHead":"20e05c0afb712434dad711a009304d9cc7bd8e03","scripts":{"dev":"vite","lint":"eslint . --report-unused-disable-directives --max-warnings 4","build":"npm run clean && npm run build:lib && npm run build:types","clean":"rm -rf dist","preview":"vite preview","build:lib":"vite build --config vite.config.lib.ts","type-check":"tsc --noEmit","build:types":"tsc --project tsconfig.build.json","build:example":"vite build","release:major":"make major","release:minor":"make minor","release:patch":"make patch","prepublishOnly":"npm run build","type-check:lib":"tsc --project tsconfig.build.json --noEmit"},"_npmUser":{"name":"agendocerto","email":"dev@agendocerto.com.br"},"repository":{"url":"git+https://github.com/AgendoCerto/flow-sdk.git","type":"git"},"_npmVersion":"10.8.2","description":"A clean, type-safe abstraction layer for React Flow with centralized state management, complete event system, and command-based API","directories":{},"sideEffects":["*.css"],"_nodeVersion":"20.19.5","dependencies":{"clsx":"^2.1.1","elkjs":"^0.11.0","immer":"^10.1.3","tailwind-merge":"^3.3.1","class-variance-authority":"^0.7.1"},"_hasShrinkwrap":false,"devDependencies":{"vite":"^7.1.9","react":"^19.2.0","eslint":"^9.0.0","globals":"^16.4.0","postcss":"^8.5.6","zustand":"^5.0.8","react-dom":"^19.2.0","@eslint/js":"^9.37.0","typescript":"^5.3.0","@types/node":"^20.19.21","tailwindcss":"^3.4.17","@types/react":"^19.2.0","autoprefixer":"^10.4.21","lucide-react":"^0.545.0","@xyflow/react":"^12.8.6","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.2.0","tailwindcss-animate":"^1.0.7","@radix-ui/react-slot":"^1.2.3","@vitejs/plugin-react":"^4.2.0","@radix-ui/react-tooltip":"^1.2.8","@radix-ui/react-separator":"^1.1.7","@typescript-eslint/parser":"^8.0.0","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.5","@typescript-eslint/eslint-plugin":"^8.0.0"},"peerDependencies":{"react":"^18.0.0 || ^19.0.0","zustand":"^5.0.0","react-dom":"^18.0.0 || ^19.0.0","lucide-react":"^0.400.0","@xyflow/react":"^12.0.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tooltip":"^1.1.0","@radix-ui/react-separator":"^1.1.0"},"peerDependenciesMeta":{"lucide-react":{"optional":false},"@radix-ui/react-slot":{"optional":false},"@radix-ui/react-tooltip":{"optional":false},"@radix-ui/react-separator":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/flow-sdk_0.3.8_1760382197729_0.7631076558192063","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@agendocerto/flow-sdk","version":"0.4.0","type":"module","description":"A clean, type-safe abstraction layer for React Flow with centralized state management, complete event system, and command-based API","author":{"name":"AgendoCerto","email":"dev@agendocerto.com"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/AgendoCerto/flow-sdk.git"},"bugs":{"url":"https://github.com/AgendoCerto/flow-sdk/issues"},"homepage":"https://github.com/AgendoCerto/flow-sdk#readme","keywords":["react-flow","flow-editor","graph-editor","node-editor","zustand","typescript","react","state-management","event-driven"],"main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./full.css":{"import":"./dist/styles/full.css","require":"./dist/styles/full.css"},"./base.css":{"import":"./dist/styles/base.css","require":"./dist/styles/base.css"},"./variables.css":{"import":"./dist/styles/variables.css","require":"./dist/styles/variables.css"},"./styles.css":{"import":"./dist/flow-sdk.css","require":"./dist/flow-sdk.css"},"./flow-sdk.css":{"import":"./dist/flow-sdk.css","require":"./dist/flow-sdk.css"}},"sideEffects":["*.css"],"scripts":{"dev":"vite","build":"npm run clean && npm run build:lib && npm run build:types && npm run copy-css","build:lib":"vite build --config vite.config.lib.ts","build:types":"tsc --project tsconfig.build.json","copy-css":"node scripts/copy-css.mjs","build:example":"vite build","preview":"vite preview","type-check":"tsc --noEmit","type-check:lib":"tsc --project tsconfig.build.json --noEmit","lint":"eslint . --report-unused-disable-directives --max-warnings 4","clean":"rm -rf dist","prepublishOnly":"npm run build","release:patch":"make patch","release:minor":"make minor","release:major":"make major"},"dependencies":{"class-variance-authority":"^0.7.1","clsx":"^2.1.1","elkjs":"^0.11.0","immer":"^10.1.3","tailwind-merge":"^3.3.1"},"peerDependencies":{"@radix-ui/react-separator":"^1.1.0","@radix-ui/react-slot":"^1.1.0","@radix-ui/react-tooltip":"^1.1.0","@xyflow/react":"^12.0.0","lucide-react":"^0.400.0","react":"^18.0.0 || ^19.0.0","react-dom":"^18.0.0 || ^19.0.0","zustand":"^5.0.0"},"peerDependenciesMeta":{"@radix-ui/react-separator":{"optional":false},"@radix-ui/react-slot":{"optional":false},"@radix-ui/react-tooltip":{"optional":false},"lucide-react":{"optional":false}},"devDependencies":{"@eslint/js":"^9.37.0","@radix-ui/react-separator":"^1.1.7","@radix-ui/react-slot":"^1.2.3","@radix-ui/react-tooltip":"^1.2.8","@types/node":"^20.19.21","@types/react":"^19.2.0","@types/react-dom":"^19.2.0","@typescript-eslint/eslint-plugin":"^8.0.0","@typescript-eslint/parser":"^8.0.0","@vitejs/plugin-react":"^4.2.0","@xyflow/react":"^12.8.6","autoprefixer":"^10.4.21","eslint":"^9.0.0","eslint-plugin-react-hooks":"^5.0.0","eslint-plugin-react-refresh":"^0.4.5","globals":"^16.4.0","lucide-react":"^0.545.0","postcss":"^8.5.6","react":"^19.2.0","react-dom":"^19.2.0","tailwindcss":"^3.4.17","tailwindcss-animate":"^1.0.7","typescript":"^5.3.0","vite":"^7.1.9","vite-plugin-dts":"^4.5.4","zustand":"^5.0.8"},"engines":{"node":">=18.0.0","npm":">=9.0.0"},"_id":"@agendocerto/flow-sdk@0.4.0","gitHead":"4cc46bc381f9a14d53aeb92ea6ec5528daa88d17","_nodeVersion":"20.19.5","_npmVersion":"10.8.2","dist":{"integrity":"sha512-6GbbXKHq6jyP3II4zMgyX021lznYV+2v8OWRdCAS9Xe8VbDPGMw+7Kj0piXgKeeTFzIRv7Wc/H1nQpW5euLMzg==","shasum":"43831ab3c1629a36824439c254694ef36a89c8a1","tarball":"https://registry.npmjs.org/@agendocerto/flow-sdk/-/flow-sdk-0.4.0.tgz","fileCount":107,"unpackedSize":14471722,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIDGpRdwmYJrvQg41ZyabX5cU57Wcbzjrk3Oyol3uH1alAiBryaqlIwCMng/6rKSl7FRTOdOaQpkNHs3DORmb+mH+YQ=="}]},"_npmUser":{"name":"agendocerto","email":"dev@agendocerto.com.br"},"directories":{},"maintainers":[{"name":"agendocerto","email":"dev@agendocerto.com.br"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/flow-sdk_0.4.0_1760394520230_0.8281214995179287"},"_hasShrinkwrap":false}},"time":{"created":"2025-10-13T19:03:17.621Z","modified":"2025-10-13T22:28:40.660Z","0.3.8":"2025-10-13T19:03:17.993Z","0.4.0":"2025-10-13T22:28:40.486Z"},"bugs":{"url":"https://github.com/AgendoCerto/flow-sdk/issues"},"author":{"name":"AgendoCerto","email":"dev@agendocerto.com"},"license":"MIT","homepage":"https://github.com/AgendoCerto/flow-sdk#readme","keywords":["react-flow","flow-editor","graph-editor","node-editor","zustand","typescript","react","state-management","event-driven"],"repository":{"type":"git","url":"git+https://github.com/AgendoCerto/flow-sdk.git"},"description":"A clean, type-safe abstraction layer for React Flow with centralized state management, complete event system, and command-based API","maintainers":[{"name":"agendocerto","email":"dev@agendocerto.com.br"}],"readme":"# Flow SDK\n\n> A clean, type-safe abstraction layer for React Flow with centralized state management, complete event system, and command-based API.\n\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)\n[![React Flow](https://img.shields.io/badge/React%20Flow-12.0+-purple.svg)](https://reactflow.dev/)\n[![License](https://img.shields.io/badge/license-Internal-green.svg)]()\n\n## Why Flow SDK?\n\nReact Flow is powerful but low-level. Building production applications requires:\n- **Manual state synchronization** between React Flow and your app\n- **Scattered event handlers** across multiple callbacks\n- **Custom TypeScript types** for every operation\n- **Boilerplate code** for common operations\n\n**Flow SDK solves these problems** with a clean architectural layer that provides:\n- ✅ Centralized state management (Zustand + Immer)\n- ✅ Complete event system (pub/sub pattern)\n- ✅ Command API (imperative operations)\n- ✅ Full TypeScript strict typing\n- ✅ SOLID principles applied\n\n## What Problems It Solves\n\n| Problem | React Flow | Flow SDK Solution |\n|---------|------------|-------------------|\n| State Management | Manual sync required | **Zustand store** with automatic sync |\n| Event Handling | Scattered callbacks | **Centralized EventBus** (pub/sub) |\n| Type Safety | Manual type guards | **Strict TypeScript** with full inference |\n| Operations | Boilerplate for each op | **Command API** for all operations |\n| Batch Updates | Complex custom logic | **Transaction system** with rollback |\n| Testing | Mock React Flow internals | **Clean interfaces**, easy mocking |\n\n## Quick Start\n\n### Installation\n\n```bash\n# Install dependencies\nnpm install\n\n# Build the library\nnpm run build\n```\n\n### Using the Compiled Library\n\nAfter building, you can import the library in your React application:\n\n```tsx\nimport { FlowAdapter, useFlowCommands, useFlowEvents } from '@agendocerto/flow-sdk';\n```\n\n#### 🎨 Importing Styles (REQUIRED)\n\nFlow SDK provides **multiple CSS options** to avoid duplication:\n\n```tsx\n// ✅ Option 1: Project WITHOUT Tailwind/shadcn (easiest)\nimport '@agendocerto/flow-sdk/full.css';\n\n// ✅ Option 2: Project WITH Tailwind/shadcn (recommended, smallest bundle)\nimport '@agendocerto/flow-sdk/base.css';\n// + configure Tailwind (see docs)\n\n// ✅ Option 3: Project WITH Tailwind, WITHOUT shadcn\nimport '@agendocerto/flow-sdk/base.css';\nimport '@agendocerto/flow-sdk/variables.css';\n// + configure Tailwind (see docs)\n```\n\n**📚 Important:** \n- **Don't use `full.css` if you already have Tailwind** (avoids ~54kb duplication!)\n- See **[Complete Styling Guide](./docs/guides/styling.md)** for detailed scenarios\n- Configure `tailwind.config.js` when using `base.css` (see docs)\n\n**Note:** See the [Quick Start Guide](./docs/guides/quick-start.md) for complete setup instructions including peer dependencies and configuration.\n\n### Basic Usage\n\n```tsx\nimport { FlowAdapter, useFlowCommands, useFlowEvents } from '@agendocerto/flow-sdk';\n\nfunction App() {\n  const commands = useFlowCommands();\n  \n  // Listen to events\n  useFlowEvents('node:click', (event) => {\n    console.log('Node clicked:', event.node.id);\n  });\n\n  // Execute commands\n  const addNode = () => {\n    commands.addNode({\n      type: 'default',\n      position: { x: 100, y: 100 },\n      data: { label: 'New Node' }\n    });\n  };\n\n  return (\n    <FlowAdapter fitView showBackground showControls>\n      <button onClick={addNode}>Add Node</button>\n    </FlowAdapter>\n  );\n}\n```\n\n## Core Concepts\n\n### 1. State (Single Source of Truth)\n\nAll graph data centralized in one place: nodes, edges, selection, viewport.\n\n```tsx\nimport { useFlowState } from '@agendocerto/flow-sdk';\n\nconst nodes = useFlowState(state => state.nodes);\nconst nodeCount = useFlowState(state => state.nodes.length);\n```\n\n### 2. Commands (Imperative API)\n\nPredictable operations with clear semantics.\n\n```tsx\nconst commands = useFlowCommands();\n\n// Add\ncommands.addNode({...});\ncommands.addEdge({...});\n\n// Update\ncommands.updateNode(id, {...});\ncommands.moveNode(id, {x, y});\n\n// Remove\ncommands.removeNode(id);\ncommands.removeEdges([id1, id2]);\n```\n\n### 3. Events (Reactive Updates)\n\nSubscribe to any change with a clean pub/sub system.\n\n```tsx\nuseFlowEvents('node:dragStop', (event) => {\n  savePosition(event.node.id, event.node.position);\n});\n\nuseFlowEvents('connect', (connection) => {\n  console.log('Connected:', connection);\n});\n```\n\n## Key Features\n\n- **🔒 Type Safe** - Full TypeScript strict mode with complete inference\n- **⚡ Performance** - Optimized selectors, shallow equality, zero unnecessary re-renders\n- **🎯 SOLID** - Clean architecture, easy to extend and maintain\n- **📡 Event-Driven** - Complete pub/sub system for all React Flow events\n- **🎮 Commands** - Imperative API for all graph operations\n- **💾 Transactions** - Batch operations with commit/rollback support\n- **🔌 Dynamic Handles** - Multiple inputs/outputs per node with automatic distribution\n- **📐 Auto Layout** - ELK.js integration for automatic graph layout\n- **🎨 shadcn-ui** - Modern, accessible UI components included by default\n\n## Documentation\n\n### Getting Started\n- **[Quick Start Guide](./docs/guides/quick-start.md)** - Get productive in 5 minutes\n- **[Core Concepts](./docs/guides/getting-started.md)** - Understand the architecture\n- **[Documentation Index](./docs/README.md)** - Complete documentation index\n\n### API Reference\n- **[Commands API](./docs/api/commands.md)** - Complete command reference\n- **[Events API](./docs/api/events.md)** - All events with examples\n- **[Hooks API](./docs/api/hooks.md)** - React hooks reference\n\n### Guides\n- **[Custom Nodes](./docs/guides/custom-nodes.md)** - Build custom node types\n- **[Dynamic Handles](./docs/guides/dynamic-handles.md)** - Multiple inputs/outputs\n- **[Auto Layout](./docs/guides/auto-layout.md)** - Automatic graph layout\n- **[Transactions](./docs/guides/transactions.md)** - Batch operations\n\n### Advanced\n- **[Events Pattern](./docs/advanced/events-pattern.md)** - \"Events on Completion Only\" philosophy\n- **[Zustand v5 Migration](./docs/advanced/zustand-v5-migration.md)** - Zustand v5 migration guide\n\n### Reference\n- **[shadcn-ui Integration](./docs/reference/shadcn-integration.md)** - Using shadcn components\n\n## Development & Examples\n\n### Running the Example Gallery\n\nRun the interactive example gallery for local development:\n\n```bash\nnpm run dev\n```\n\nThis starts a development server showcasing all Flow SDK features in the **Unified Control Panel** example.\n\n### Available Scripts\n\n```bash\nnpm run dev              # Start development server\nnpm run build            # Build library (ESM + CJS + types)\nnpm run build:lib        # Build library bundles only\nnpm run build:types      # Generate TypeScript declarations\nnpm run type-check       # Type check entire project\nnpm run type-check:lib   # Type check library only\nnpm run lint             # Run ESLint\nnpm run clean            # Remove build artifacts\n```\n\n### Example Features\n\nThe Unified Control Panel demonstrates:\n- 🎮 **Complete Feature Showcase** - All SDK capabilities in one interface\n- 📦 **Node Management** - Add, remove, duplicate, and modify nodes\n- 🔗 **Edge Management** - Create and manage connections\n- 🔌 **Dynamic Handles** - Add/remove handles at runtime\n- ✨ **Selection System** - Box selection and batch operations\n- 📐 **Auto Layout** - Multiple layout algorithms (layered, force, radial)\n- 🎨 **Custom Node Types** - WhatsApp-style components, cards, and more\n- ⚡ **Transactions** - Batch operations with rollback support\n\nSee **[example/UnifiedExample.tsx](./example/UnifiedExample.tsx)** for the complete implementation.\n\n## API Quick Reference\n\n### Commands\n\n```typescript\n// Nodes\naddNode(node: Omit<Node, 'id'> & { id?: string }): string\nremoveNode(nodeId: string): void\nupdateNode(nodeId: string, updates: Partial<Node>): void\nmoveNode(nodeId: string, position: Position): void\nduplicateNode(nodeId: string, offset?: Position): string\n\n// Edges\naddEdge(edge: Omit<Edge, 'id'> & { id?: string }): string\nremoveEdge(edgeId: string): void\nupdateEdge(edgeId: string, updates: Partial<Edge>): void\nreconnectEdge(edgeId, newSource, newTarget, ...): void\n\n// Handles\naddInputHandle(nodeId, handleId?, label?, position?, color?): string\naddOutputHandle(nodeId, handleId?, label?, position?, color?): string\nremoveHandle(nodeId: string, handleId: string): void\n\n// Selection\nsetSelection(nodeIds: string[], edgeIds: string[]): void\naddToSelection(nodeIds: string[], edgeIds: string[]): void\nclearSelection(): void\n\n// Viewport\nfitView(padding?: number): void\ncenterNode(nodeId: string, zoom?: number): void\nzoomTo(zoom: number): void\nzoomIn(step?: number): void\nzoomOut(step?: number): void\n\n// Transactions\nstartTransaction(options?: TransactionOptions): void\ncommit(): CommandResult\nrollback(): void\n\n// Layout\napplyAutoLayout(algorithm?, direction?, spacing?): Promise<void>\n\n// Utility\nclear(): void\nreset(nodes?: Node[], edges?: Edge[]): void\n```\n\n**[→ Full API Reference](./docs/api/commands.md)**\n\n### Events\n\n```typescript\n// Node events\nuseFlowEvents('node:click', handler)\nuseFlowEvents('node:doubleClick', handler)\nuseFlowEvents('node:dragStart', handler)\nuseFlowEvents('node:dragStop', handler)\n\n// Edge events\nuseFlowEvents('edge:click', handler)\nuseFlowEvents('edge:mouseEnter', handler)\nuseFlowEvents('edge:mouseLeave', handler)\n\n// Connection events\nuseFlowEvents('connect', handler)\nuseFlowEvents('connect:start', handler)\nuseFlowEvents('connect:end', handler)\n\n// Selection events\nuseFlowEvents('selection:change', handler)\nuseFlowEvents('selection:dragStart', handler)\nuseFlowEvents('selection:dragStop', handler)\n\n// Viewport events\nuseFlowEvents('move:start', handler)\nuseFlowEvents('move:end', handler)\n\n// Lifecycle events\nuseFlowEvents('init', handler)\nuseFlowEvents('delete', handler)\n```\n\n**[→ Full Events Reference](./docs/api/events.md)**\n\n### React Hooks\n\n```typescript\n// Commands\nconst commands = useFlowCommands()\n\n// State (optimized selectors)\nconst nodes = useFlowState(s => s.nodes)\nconst nodes = useFlowNodes()  // Shortcut\nconst edges = useFlowEdges()  // Shortcut\nconst selection = useFlowSelection()  // Shortcut\nconst viewport = useFlowViewport()  // Shortcut\nconst stats = useFlowStats()  // Computed stats\n\n// Events\nuseFlowEvents(eventName, handler, deps?)\nuseFlowEventsMultiple(handlers, deps?)\n```\n\n**[→ Full Hooks Reference](./docs/api/hooks.md)**\n\n## Architecture Highlights\n\n### Clean Separation of Concerns\n\n```\n┌─────────────────────────────────────┐\n│         React Components            │\n│    (UI Layer - FlowAdapter)         │\n└──────────────┬──────────────────────┘\n               │\n┌──────────────▼──────────────────────┐\n│          React Hooks                │\n│  (useFlowCommands, useFlowEvents)   │\n└──────────────┬──────────────────────┘\n               │\n┌──────────────▼──────────────────────┐\n│       Core Interfaces               │\n│  (IGraphState, IGraphCommands)      │\n└──────────────┬──────────────────────┘\n               │\n┌──────────────▼──────────────────────┐\n│       Zustand Store                 │\n│  (State + Commands + Events)        │\n└──────────────┬──────────────────────┘\n               │\n┌──────────────▼──────────────────────┐\n│       React Flow                    │\n│    (Rendering Layer)                │\n└─────────────────────────────────────┘\n```\n\n### SOLID Principles\n\n- **Single Responsibility**: Each module has one clear purpose\n- **Open/Closed**: Extensible through events and interfaces\n- **Liskov Substitution**: Interfaces are fully interchangeable\n- **Interface Segregation**: Focused interfaces (IGraphState, IGraphCommands, IEditorEvents)\n- **Dependency Inversion**: Depends on abstractions, not concrete implementations\n\n## Performance\n\nFlow SDK is optimized for zero lag and minimal re-renders:\n\n- ⚡ **Events on Completion Only** - No events during continuous actions (drag, pan, zoom)\n- ⚡ **Shallow Equality** - Default selector comparison prevents unnecessary re-renders\n- ⚡ **Optimized Hooks** - Memoized selectors (useFlowNodes, useFlowEdges)\n- ⚡ **Batched Updates** - RAF-based batching for position updates\n- ⚡ **Smart Subscriptions** - Subscribe only to needed state slices\n\n**Result:** 150x better performance compared to naive event handling.\n\n## Contributing\n\nThis is an internal project. For questions or suggestions, contact the development team.\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for version history and breaking changes.\n\n## License\n\nInternal use only.\n\n---\n\n**Built with ❤️ using React Flow, Zustand, TypeScript, and shadcn-ui**\n","readmeFilename":"README.md"}