{"_id":"@bernierllc/generic-workflow-ui","_rev":"8-039f265c4ce459e8548a78f333e37d89","name":"@bernierllc/generic-workflow-ui","dist-tags":{"latest":"1.4.0"},"versions":{"1.0.1":{"name":"@bernierllc/generic-workflow-ui","version":"1.0.1","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.0.1","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"748ce48a2408a8a65b6d244e6216800348f9dc5a","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.0.1.tgz","fileCount":48,"integrity":"sha512-8aMDcL/JoTl6ct0ppFcbukgzfhtyLpZa//lPaeIFixzH136QQu7d4MQwhPiXIX6x7TESdGvUxT8Nkj8w5FKrhA==","signatures":[{"sig":"MEYCIQDVmdn0XGIhOeFcMKRizf+uAGEhJspidwfLGldet/haAwIhAO4LN7Z2A6jfrv9cgIFQyLT6LIVMefWhvnmUm6VRRfoT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90937},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"addc832be768fa1aff45749ca2bdecc8ba46390a","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.6.2","description":"Generic, reusable workflow UI components for any workflow type","directories":{},"_nodeVersion":"25.2.0","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.0.1_1763315765350_0.1355191598487795","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@bernierllc/generic-workflow-ui","version":"1.0.2","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.0.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"9a34a2b3bbd73602a08494863e59a269c69ef173","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.0.2.tgz","fileCount":48,"integrity":"sha512-ed+KptdhVYZCbpfVLrF/2BjHVDufVIEqLkpt1DA0d4XOgo03iJhCuEg8l6Lh2bkUq4j4C9gKptZv8inpiD+/NQ==","signatures":[{"sig":"MEUCID81w29fjqHAxS3pv5ZxDO4hVDJTTlnoZ2saGndjFsvRAiEA6nSd2QCecvlPK4pOBCYLPBmY0I4HwCqTN8M/N0E6vqg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":90937},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"addc832be768fa1aff45749ca2bdecc8ba46390a","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.6.2","description":"Generic, reusable workflow UI components for any workflow type","directories":{},"_nodeVersion":"25.2.0","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.0.2_1763315967996_0.6861391401497754","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@bernierllc/generic-workflow-ui","version":"1.1.0","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.1.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"e517d5fad0c09d51df8088b75dc4a1555902c37f","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.1.0.tgz","fileCount":78,"integrity":"sha512-NJmy1k4cErTW+gOd+NbZQvYOBFAfPg0aAQKj/RrDlrl2Wp7/9GeWPBH9EanZnwJwexHBJnXcbhhKzeF4bwC52w==","signatures":[{"sig":"MEYCIQCKi8RVzourSvKOiFTGzbliipxRi+N0ksF6fHTEwG8WCwIhAJbxu4X9M0R8ZhfaMqIaJ/xP6YGPua3Qdmow2O51QAPp","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":170919},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"11b68d8a542936bacd057bf1066820d5507aa88f","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"mkbernier","email":"mkbernier@gmail.com"},"bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.6.2","description":"Generic, reusable workflow UI components with linear and graph visualization","directories":{},"_nodeVersion":"25.2.0","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@xyflow/react":"^12.3.5","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/dagre":"^0.7.52","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","identity-obj-proxy":"^3.0.0","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.1.0_1763324564956_0.22780772663813664","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@bernierllc/generic-workflow-ui","version":"1.1.2","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.1.2","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"b6403b4ca397b4719b25fd10336f93e7aba995b9","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.1.2.tgz","fileCount":78,"integrity":"sha512-I6Mjctfzg+ChAfBaAK8IHPLtOiueBEHqLiMkZd8l9c98oz/ftJbCcSuA9kdhbe+p6a+kjJSmPqoXdcoIOZcRXg==","signatures":[{"sig":"MEUCIDnRON1mbvK4jdQHrs17EO3OhZl5O4LWENpGbofzVvE4AiEA3JJQTmmnpkbLKjwAk3kF4roYVk8bSEAB0vThhS6paGo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171085},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"af7e74b3715d56d3a193e1bb6743b337c2b0df6d","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7bbad082-57ce-436b-af37-6570cd17ad97"}},"bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"lerna/9.0.3/node@v20.19.6+x64 (linux)","description":"Generic, reusable workflow UI components with linear and graph visualization","directories":{},"_nodeVersion":"20.19.6","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@xyflow/react":"^12.3.5","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/dagre":"^0.7.52","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","identity-obj-proxy":"^3.0.0","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.1.2_1767642354471_0.554248978299045","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@bernierllc/generic-workflow-ui","version":"1.1.3","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.1.3","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"1ebabdfec4058050cc52487e66101c37bde662de","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.1.3.tgz","fileCount":78,"integrity":"sha512-sfzzEb7SqBwN6nDhywYz/t4sh4slcEi3zxlbLoWh1sMIOGI9fftihs6W/0AdzuSbAiFy2AYD03kppHKRxbiVww==","signatures":[{"sig":"MEUCIBR4dY837Fmif/B94Bpc30A2XnTC6bMIuhPYoqZL25y0AiEAgfeVyzP7X/d4BuulISxYo6NnlQlFj8ZUBZflFvOwuOU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171027},"main":"dist/index.js","_from":"file:bernierllc-generic-workflow-ui-1.1.3.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7bbad082-57ce-436b-af37-6570cd17ad97"}},"_resolved":"/tmp/323adbe88be6c11a6343f0f6eb4d5135/bernierllc-generic-workflow-ui-1.1.3.tgz","_integrity":"sha512-sfzzEb7SqBwN6nDhywYz/t4sh4slcEi3zxlbLoWh1sMIOGI9fftihs6W/0AdzuSbAiFy2AYD03kppHKRxbiVww==","bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.11.0","description":"Generic, reusable workflow UI components with linear and graph visualization","directories":{},"_nodeVersion":"20.20.0","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@xyflow/react":"^12.3.5","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/dagre":"^0.7.52","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","identity-obj-proxy":"^3.0.0","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.1.3_1773078149633_0.9577584255904885","host":"s3://npm-registry-packages-npm-production"}},"1.1.4":{"name":"@bernierllc/generic-workflow-ui","version":"1.1.4","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.1.4","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"f08fda232459fa763a891e7f0c48c2522f5dac7f","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.1.4.tgz","fileCount":78,"integrity":"sha512-Tw5eL3U5Q3/jBx6RvLCsUYqTChRMtCgAlOepklIKiavXQ0eMouC40LaRJK7dbVy9pTSyeP9aJ9r2idYvn9IWQw==","signatures":[{"sig":"MEQCIAimUGJMgpXmEh27VToF3pvC0sqRD8Qq4IMGX++X284OAiA6svo2wyzcAxkcn8B6DXZF3vz5bYejYUSzAPymV3dRMQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171027},"main":"dist/index.js","_from":"file:bernierllc-generic-workflow-ui-1.1.4.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7bbad082-57ce-436b-af37-6570cd17ad97"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/generic-workflow-ui/bernierllc-generic-workflow-ui-1.1.4.tgz","_integrity":"sha512-Tw5eL3U5Q3/jBx6RvLCsUYqTChRMtCgAlOepklIKiavXQ0eMouC40LaRJK7dbVy9pTSyeP9aJ9r2idYvn9IWQw==","bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.11.0","description":"Generic, reusable workflow UI components with linear and graph visualization","directories":{},"_nodeVersion":"20.20.0","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@xyflow/react":"^12.3.5","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/dagre":"^0.7.52","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","identity-obj-proxy":"^3.0.0","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.1.4_1773163810175_0.8177639052849137","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@bernierllc/generic-workflow-ui","version":"1.2.0","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","_id":"@bernierllc/generic-workflow-ui@1.2.0","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"homepage":"https://github.com/bernier-llc/tools#readme","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"dist":{"shasum":"8432c87d7713c26ddcd573963691477a8e21f489","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.2.0.tgz","fileCount":78,"integrity":"sha512-2gUcLX8TihGG6LRKiwxk70Kh02+1vy8e2LTUWkeSy3HthuBNXgyoEL4L9QjdD22MjuFih5gpEZwcXvo4bAwV9w==","signatures":[{"sig":"MEQCIEQvMIYA/sKL8rDV6hKuBzwQiBq7NU3o82INSeFTaetPAiBclW5YhaN3NQlYeFSsWtAqvqdm0oqOKS8mRFWfsbX1Ng==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":171027},"main":"dist/index.js","_from":"file:bernierllc-generic-workflow-ui-1.2.0.tgz","types":"dist/index.d.ts","scripts":{"lint":"eslint src --ext .ts,.tsx","test":"jest --watch","build":"tsc","clean":"rm -rf dist coverage","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7bbad082-57ce-436b-af37-6570cd17ad97"}},"_resolved":"/home/runner/work/tools/tools/packages/ui/generic-workflow-ui/bernierllc-generic-workflow-ui-1.2.0.tgz","_integrity":"sha512-2gUcLX8TihGG6LRKiwxk70Kh02+1vy8e2LTUWkeSy3HthuBNXgyoEL4L9QjdD22MjuFih5gpEZwcXvo4bAwV9w==","bernierllc":{"category":"ui","integration":{"logger":"not-applicable","neverhub":"not-applicable","docs-suite":"ready"},"testCoverage":80},"repository":{"url":"git+https://github.com/bernier-llc/tools.git","type":"git","directory":"packages/ui/generic-workflow-ui"},"_npmVersion":"11.14.1","description":"Generic, reusable workflow UI components with linear and graph visualization","directories":{},"_nodeVersion":"20.20.2","dependencies":{"clsx":"^2.1.1","react":"^19.0.0","tamagui":"^1.135.1","date-fns":"^3.6.0","react-dom":"^19.0.0","@xyflow/react":"^12.3.5","@tamagui/config":"^1.135.1"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","ts-jest":"^29.1.1","typescript":"^5.3.3","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/dagre":"^0.7.52","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","react-native-web":"^0.21.2","identity-obj-proxy":"^3.0.0","eslint-plugin-react":"^7.33.2","@testing-library/react":"^16.0.1","jest-environment-jsdom":"^29.7.0","@testing-library/jest-dom":"^6.1.5","@typescript-eslint/parser":"^6.16.0","eslint-plugin-react-hooks":"^4.6.0","@testing-library/user-event":"^14.5.1","@typescript-eslint/eslint-plugin":"^6.16.0"},"peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/generic-workflow-ui_1.2.0_1779242028489_0.7512417814945918","host":"s3://npm-registry-packages-npm-production"}},"1.4.0":{"name":"@bernierllc/generic-workflow-ui","version":"1.4.0","description":"Generic, reusable workflow UI components with linear and graph visualization","main":"dist/index.js","types":"dist/index.d.ts","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","peerDependencies":{"react":">=19.0.0","react-dom":">=19.0.0"},"dependencies":{"@tamagui/config":"^1.135.1","@xyflow/react":"^12.3.5","clsx":"^2.1.1","date-fns":"^3.6.0","react":"^19.0.0","react-dom":"^19.0.0","tamagui":"^1.135.1"},"devDependencies":{"@testing-library/jest-dom":"^6.1.5","@testing-library/react":"^16.0.1","@testing-library/user-event":"^14.5.1","@types/dagre":"^0.7.52","@types/jest":"^29.5.11","@types/node":"^20.10.6","@types/react":"^18.2.79","@types/react-dom":"^18.2.18","@typescript-eslint/eslint-plugin":"^6.16.0","@typescript-eslint/parser":"^6.16.0","dagre":"^0.8.5","elkjs":"^0.9.3","eslint":"^8.56.0","eslint-plugin-react":"^7.33.2","eslint-plugin-react-hooks":"^4.6.0","identity-obj-proxy":"^3.0.0","jest":"^29.7.0","jest-environment-jsdom":"^29.7.0","react-native-web":"^0.21.2","ts-jest":"^29.1.1","typescript":"^5.3.3"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/ui/generic-workflow-ui"},"bernierllc":{"category":"ui","testCoverage":80,"integration":{"logger":"not-applicable","docs-suite":"ready","neverhub":"not-applicable"}},"scripts":{"build":"tsc","test":"jest --watch","test:run":"jest --watchAll=false","test:coverage":"jest --coverage --watchAll=false","lint":"eslint src --ext .ts,.tsx","clean":"rm -rf dist coverage"},"_id":"@bernierllc/generic-workflow-ui@1.4.0","bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"homepage":"https://github.com/bernier-llc/tools#readme","_integrity":"sha512-m7Su+duvFIyaJxrNlJ0gBSux+RFF25W8vR71Yom3WQTZ200lUzx5IOd76MpA2yWyJwo2K/C/ykxz40l/dIZ/RA==","_resolved":"/home/runner/work/tools/tools/packages/ui/generic-workflow-ui/bernierllc-generic-workflow-ui-1.4.0.tgz","_from":"file:bernierllc-generic-workflow-ui-1.4.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"11.14.1","dist":{"integrity":"sha512-m7Su+duvFIyaJxrNlJ0gBSux+RFF25W8vR71Yom3WQTZ200lUzx5IOd76MpA2yWyJwo2K/C/ykxz40l/dIZ/RA==","shasum":"0b26d453d72efbf25525560d044aa47f0a9fdad7","tarball":"https://registry.npmjs.org/@bernierllc/generic-workflow-ui/-/generic-workflow-ui-1.4.0.tgz","fileCount":81,"unpackedSize":173522,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGI5Q/1rM0hW/tFR9BTVeAwg0YEltQiGuAJ+Y9lkKIeLAiEA+JjVtIXX62O8A32fOniwl7JXOhizDR2Q0wjfml/D3/g="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:7bbad082-57ce-436b-af37-6570cd17ad97"}},"directories":{},"maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/generic-workflow-ui_1.4.0_1779250781294_0.5467035593676877"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-16T17:56:05.187Z","modified":"2026-05-20T04:19:41.618Z","1.0.1":"2025-11-16T17:56:05.564Z","1.0.2":"2025-11-16T17:59:28.189Z","1.1.0":"2025-11-16T20:22:45.167Z","1.1.2":"2026-01-05T19:45:54.623Z","1.1.3":"2026-03-09T17:42:29.785Z","1.1.4":"2026-03-10T17:30:10.309Z","1.2.0":"2026-05-20T01:53:48.638Z","1.4.0":"2026-05-20T04:19:41.446Z"},"bugs":{"url":"https://github.com/bernier-llc/tools/issues"},"author":{"name":"Bernier LLC"},"license":"SEE LICENSE IN LICENSE","homepage":"https://github.com/bernier-llc/tools#readme","keywords":["workflow","ui","react","tamagui","generic","state-machine","n8n","workflow-builder","react-flow","graph-visualization","drag-and-drop"],"repository":{"type":"git","url":"git+https://github.com/bernier-llc/tools.git","directory":"packages/ui/generic-workflow-ui"},"description":"Generic, reusable workflow UI components with linear and graph visualization","maintainers":[{"name":"alikhan410","email":"mczeyo@gmail.com"},{"name":"mkbernier","email":"mkbernier@gmail.com"}],"readme":"/*\nCopyright (c) 2025 Bernier LLC\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n*/\n\n# @bernierllc/generic-workflow-ui\n\nGeneric, reusable workflow UI components with dual visualization modes: linear (Tamagui-based stepper) and graph (react-flow-based canvas). This package provides domain-agnostic React components for visualizing and managing workflows using TypeScript.\n\n**Version**: 1.1.0\n\n## Installation\n\n```bash\nnpm install @bernierllc/generic-workflow-ui\n```\n\n### Peer Dependencies\n\nThis package requires React 19:\n\n```bash\nnpm install react@^19.0.0 react-dom@^19.0.0\n```\n\n### Optional Dependencies\n\nFor advanced graph layout algorithms:\n\n```bash\nnpm install dagre elkjs  # For automatic graph layout\n```\n\n## Overview\n\n@bernierllc/generic-workflow-ui provides two complementary visualization modes:\n\n1. **Linear Mode** (Tamagui): Sequential, step-based workflow visualization\n   - Best for: Simple, linear workflows with clear progression\n   - Components: Stepper, Timeline, Progress Bar, Status Indicator\n\n2. **Graph Mode** (react-flow): Complex, graph-based workflow visualization with drag-and-drop\n   - Best for: Branching workflows, complex state machines, visual workflow design\n   - Components: Canvas, Node Editor, Edge Editor, Graph Builder\n\nBoth modes work with the same underlying `GenericWorkflow` data structure, allowing seamless conversion between visualization styles.\n\n## Features\n\n- **Dual Visualization**: Linear stepper AND graph-based canvas\n- **Generic TypeScript Types**: Works with any workflow domain\n- **n8n-Style JSON**: Compatible with n8n workflow definitions\n- **React 19 Support**: Built for the latest React version\n- **Tamagui & react-flow**: Combines the best of both libraries\n- **Drag-and-Drop**: Visual workflow editing in graph mode\n- **JSON Import/Export**: Serialize workflows to/from JSON\n- **Admin Components**: Stage and transition editors\n- **Dark/Light Themes**: Full theme support\n- **Accessibility**: WCAG 2.1 AA compliant\n- **Test Coverage**: 77% coverage with comprehensive tests\n\n## Quick Start\n\n### Linear Mode (Tamagui Stepper)\n\n```tsx\nimport {\n  GenericWorkflowStepper,\n  GenericActionButtons,\n  GenericWorkflow,\n  GenericWorkflowStatus,\n  GenericActionButton\n} from '@bernierllc/generic-workflow-ui';\n\n// Define your workflow\nconst workflow: GenericWorkflow = {\n  id: 'my-workflow',\n  name: 'My Workflow',\n  stages: [\n    { id: 'draft', name: 'Draft', order: 0 },\n    { id: 'review', name: 'Review', order: 1 },\n    { id: 'published', name: 'Published', order: 2 }\n  ],\n  transitions: [\n    { id: 't1', from: 'draft', to: 'review' },\n    { id: 't2', from: 'review', to: 'published' }\n  ]\n};\n\n// Define workflow status\nconst status: GenericWorkflowStatus = {\n  workflowId: 'my-workflow',\n  currentStageId: 'review',\n  availableTransitions: ['t2']\n};\n\n// Use the linear stepper\nfunction MyLinearWorkflow() {\n  return (\n    <GenericWorkflowStepper\n      workflow={workflow}\n      currentStageId={status.currentStageId}\n      config={{ orientation: 'horizontal' }}\n    />\n  );\n}\n```\n\n### Graph Mode (react-flow Canvas)\n\n```tsx\nimport { GenericWorkflowCanvas } from '@bernierllc/generic-workflow-ui';\n\n// Use the same workflow from above\nfunction MyGraphWorkflow() {\n  const [currentWorkflow, setCurrentWorkflow] = useState(workflow);\n\n  return (\n    <GenericWorkflowCanvas\n      workflow={currentWorkflow}\n      currentStageId=\"review\"\n      config={{\n        minimap: true,\n        controls: true,\n        background: 'dots',\n        fitView: true,\n        snapToGrid: true\n      }}\n      onWorkflowChange={(updated) => setCurrentWorkflow(updated)}\n      onNodeClick={(stageId) => console.log('Clicked stage:', stageId)}\n    />\n  );\n}\n```\n\n### Enhanced Builder with Mode Toggle\n\n```tsx\nimport { GenericWorkflowBuilderV2 } from '@bernierllc/generic-workflow-ui';\n\nfunction MyWorkflowBuilder() {\n  return (\n    <GenericWorkflowBuilderV2\n      initialWorkflow={workflow}\n      initialMode=\"graph\"\n      config={{\n        allowJSONImport: true,\n        allowJSONExport: true,\n        showJSONView: true,\n        allowModeToggle: true  // Toggle between linear and graph\n      }}\n      onSave={({ generic, json }) => {\n        console.log('Saved workflow:', generic);\n        console.log('JSON representation:', json);\n      }}\n    />\n  );\n}\n```\n\n## API Reference\n\n### Linear Components (Tamagui)\n\n#### GenericWorkflowStepper\n\nVisual progress through workflow stages.\n\n```tsx\ninterface GenericWorkflowStepperProps<StageMetadata = any> {\n  workflow: GenericWorkflow<StageMetadata>;\n  currentStageId: string;\n  config?: {\n    orientation?: 'horizontal' | 'vertical';\n    showDescriptions?: boolean;\n    showIcons?: boolean;\n    size?: 'small' | 'medium' | 'large';\n  };\n  onStageChange?: (stageId: string) => void;\n  customStageRenderer?: (\n    stage: GenericStage<StageMetadata>,\n    isActive: boolean,\n    isCompleted: boolean\n  ) => React.ReactNode;\n}\n\n<GenericWorkflowStepper\n  workflow={workflow}\n  currentStageId=\"review\"\n  config={{\n    orientation: 'horizontal',\n    showDescriptions: true,\n    showIcons: true\n  }}\n  onStageChange={(stageId) => console.log('Changed to:', stageId)}\n/>\n```\n\n#### GenericActionButtons\n\nContext-aware action buttons.\n\n```tsx\ninterface GenericActionButtonsProps {\n  workflowStatus: GenericWorkflowStatus;\n  actions: GenericActionButton[];\n  config?: {\n    size?: 'small' | 'medium' | 'large';\n    variant?: 'primary' | 'secondary' | 'outline';\n    showIcons?: boolean;\n    layout?: 'horizontal' | 'vertical';\n  };\n}\n\n<GenericActionButtons\n  workflowStatus={status}\n  actions={[\n    {\n      id: 'approve',\n      label: 'Approve',\n      visible: true,\n      onClick: () => handleApprove()\n    }\n  ]}\n  config={{ size: 'medium', variant: 'primary' }}\n/>\n```\n\n#### GenericWorkflowTimeline\n\nHistorical workflow activity timeline.\n\n```tsx\ninterface GenericWorkflowTimelineProps {\n  items: GenericTimelineItem[];\n  config?: {\n    showTimestamps?: boolean;\n    showUsers?: boolean;\n    maxItems?: number;\n    dateFormat?: string;\n  };\n}\n\n<GenericWorkflowTimeline\n  items={timelineItems}\n  config={{\n    showTimestamps: true,\n    showUsers: true,\n    maxItems: 5\n  }}\n/>\n```\n\n#### GenericWorkflowProgressBar\n\nProgress bar with stage indicators.\n\n```tsx\ninterface GenericWorkflowProgressBarProps<StageMetadata = any> {\n  workflow: GenericWorkflow<StageMetadata>;\n  currentStageId: string;\n  config?: {\n    showStageLabels?: boolean;\n    showPercentage?: boolean;\n    height?: number;\n    color?: string;\n  };\n}\n\n<GenericWorkflowProgressBar\n  workflow={workflow}\n  currentStageId=\"review\"\n  config={{\n    showStageLabels: true,\n    showPercentage: true\n  }}\n/>\n```\n\n#### GenericWorkflowStatusIndicator\n\nCompact workflow status display.\n\n```tsx\ninterface GenericWorkflowStatusIndicatorProps {\n  status: GenericWorkflowStatus;\n  config?: {\n    size?: 'small' | 'medium' | 'large';\n    showText?: boolean;\n    showTransitions?: boolean;\n  };\n}\n\n<GenericWorkflowStatusIndicator\n  status={status}\n  config={{\n    size: 'medium',\n    showText: true,\n    showTransitions: true\n  }}\n/>\n```\n\n### Graph Components (react-flow)\n\n#### GenericWorkflowCanvas\n\nGraph-based workflow visualization with drag-and-drop editing.\n\n```tsx\ninterface GenericWorkflowCanvasProps<\n  StageMetadata = any,\n  TransitionMetadata = any\n> {\n  workflow: GenericWorkflow<StageMetadata, TransitionMetadata>;\n  currentStageId?: string;\n  config?: CanvasConfig;\n  onWorkflowChange?: (workflow: GenericWorkflow) => void;\n  onNodeClick?: (stageId: string) => void;\n  onEdgeClick?: (transitionId: string) => void;\n  readOnly?: boolean;\n}\n\ninterface CanvasConfig {\n  nodeStyle?: {\n    width?: number;\n    height?: number;\n    borderRadius?: number;\n    backgroundColor?: string;\n  };\n  edgeStyle?: {\n    strokeWidth?: number;\n    strokeColor?: string;\n    animated?: boolean;\n  };\n  minimap?: boolean;              // Show minimap navigation\n  controls?: boolean;             // Show zoom/pan controls\n  background?: 'dots' | 'lines' | 'cross' | 'none';\n  fitView?: boolean;              // Auto-fit workflow to viewport\n  snapToGrid?: boolean;           // Snap nodes to grid\n  gridSize?: number;              // Grid size in pixels\n}\n\n<GenericWorkflowCanvas\n  workflow={workflow}\n  currentStageId=\"review\"\n  config={{\n    minimap: true,\n    controls: true,\n    background: 'dots',\n    fitView: true,\n    snapToGrid: true,\n    gridSize: 15\n  }}\n  onWorkflowChange={(updated) => setWorkflow(updated)}\n  onNodeClick={(stageId) => console.log('Clicked:', stageId)}\n  readOnly={false}\n/>\n```\n\n#### GenericWorkflowNode\n\nCustom react-flow node component for workflow stages.\n\n```tsx\ninterface GenericNodeData<StageMetadata = any> {\n  stage: GenericStage<StageMetadata>;\n  isActive: boolean;\n  isCompleted: boolean;\n  workflowId: string;\n}\n\n// Used internally by GenericWorkflowCanvas\n// Custom rendering available via canvas config\n```\n\n#### GenericWorkflowEdge\n\nCustom react-flow edge component for workflow transitions.\n\n```tsx\ninterface GenericEdgeData<TransitionMetadata = any> {\n  transition: GenericTransition<TransitionMetadata>;\n  isAvailable: boolean;\n  workflowId: string;\n}\n\n// Used internally by GenericWorkflowCanvas\n// Custom rendering available via canvas config\n```\n\n### Workflow Converters\n\n#### linearToGraph\n\nConverts linear workflow to graph representation with auto-layout.\n\n```tsx\ninterface WorkflowLayoutOptions {\n  algorithm: 'dagre' | 'elk' | 'manual';\n  direction: 'TB' | 'LR' | 'BT' | 'RL'; // Top-Bottom, Left-Right, etc.\n  nodeSpacing: number;\n  rankSpacing: number;\n}\n\nfunction linearToGraph(\n  workflow: GenericWorkflow,\n  layoutOptions?: WorkflowLayoutOptions\n): ReactFlowWorkflow;\n\n// Example usage\nimport { linearToGraph } from '@bernierllc/generic-workflow-ui';\n\nconst graphWorkflow = linearToGraph(workflow, {\n  algorithm: 'dagre',\n  direction: 'TB',\n  nodeSpacing: 50,\n  rankSpacing: 100\n});\n```\n\n#### graphToLinear\n\nConverts graph workflow back to linear representation.\n\n```tsx\nfunction graphToLinear(\n  reactFlowWorkflow: ReactFlowWorkflow\n): GenericWorkflow;\n\n// Example usage\nimport { graphToLinear } from '@bernierllc/generic-workflow-ui';\n\nconst linearWorkflow = graphToLinear(graphWorkflow);\n```\n\n### Hooks\n\n#### useWorkflowCanvas\n\nCanvas state management hook.\n\n```tsx\nfunction useWorkflowCanvas(\n  initialWorkflow: GenericWorkflow,\n  config?: CanvasConfig\n): {\n  nodes: Node[];\n  edges: Edge[];\n  onNodesChange: (changes: NodeChange[]) => void;\n  onEdgesChange: (changes: EdgeChange[]) => void;\n  onConnect: (connection: Connection) => void;\n  workflow: GenericWorkflow;\n  updateWorkflow: (workflow: GenericWorkflow) => void;\n};\n\n// Example usage\nimport { useWorkflowCanvas } from '@bernierllc/generic-workflow-ui';\n\nfunction MyCanvas() {\n  const {\n    nodes,\n    edges,\n    onNodesChange,\n    onEdgesChange,\n    onConnect,\n    workflow\n  } = useWorkflowCanvas(initialWorkflow, {\n    fitView: true,\n    snapToGrid: true\n  });\n\n  return (\n    <ReactFlow\n      nodes={nodes}\n      edges={edges}\n      onNodesChange={onNodesChange}\n      onEdgesChange={onEdgesChange}\n      onConnect={onConnect}\n    />\n  );\n}\n```\n\n### Builder Components\n\n#### GenericWorkflowBuilder (v1.0.2 - Linear Only)\n\nVisual workflow builder with JSON import/export.\n\n```tsx\ninterface GenericWorkflowBuilderProps {\n  initialWorkflow?: GenericWorkflow;\n  config?: {\n    allowJSONImport?: boolean;\n    allowJSONExport?: boolean;\n    showJSONView?: boolean;\n  };\n  onSave?: (result: {\n    generic: GenericWorkflow;\n    json: WorkflowJSONDefinition;\n  }) => void;\n}\n\n<GenericWorkflowBuilder\n  initialWorkflow={workflow}\n  config={{\n    allowJSONImport: true,\n    allowJSONExport: true,\n    showJSONView: true\n  }}\n  onSave={({ generic, json }) => {\n    console.log('Generic workflow:', generic);\n    console.log('JSON workflow:', json);\n  }}\n/>\n```\n\n#### GenericWorkflowBuilderV2 (v1.1.0 - Dual Mode)\n\nEnhanced builder with linear/graph mode toggle.\n\n```tsx\ninterface GenericWorkflowBuilderV2Props {\n  initialWorkflow?: GenericWorkflow;\n  initialMode?: 'linear' | 'graph';\n  config?: {\n    allowJSONImport?: boolean;\n    allowJSONExport?: boolean;\n    showJSONView?: boolean;\n    allowModeToggle?: boolean;      // NEW: Toggle between modes\n    canvasConfig?: CanvasConfig;    // NEW: Graph canvas settings\n  };\n  onSave?: (result: {\n    generic: GenericWorkflow;\n    json: WorkflowJSONDefinition;\n  }) => void;\n}\n\n<GenericWorkflowBuilderV2\n  initialWorkflow={workflow}\n  initialMode=\"graph\"\n  config={{\n    allowJSONImport: true,\n    allowJSONExport: true,\n    showJSONView: true,\n    allowModeToggle: true,\n    canvasConfig: {\n      minimap: true,\n      controls: true,\n      background: 'dots'\n    }\n  }}\n  onSave={({ generic, json }) => console.log('Saved:', generic)}\n/>\n```\n\n### Admin Components\n\n#### GenericWorkflowStageEditor\n\nStage management interface.\n\n```tsx\n<GenericWorkflowStageEditor\n  stage={stage}\n  stages={workflow.stages}\n  onSave={(updatedStage) => console.log('Saved:', updatedStage)}\n  onDelete={(stageId) => console.log('Deleted:', stageId)}\n/>\n```\n\n#### GenericWorkflowTransitionEditor\n\nTransition management interface.\n\n```tsx\n<GenericWorkflowTransitionEditor\n  transitions={workflow.transitions}\n  stages={workflow.stages}\n  onSave={(updatedTransitions) => console.log('Saved:', updatedTransitions)}\n/>\n```\n\n#### GenericWorkflowAdminConfig\n\nComplete admin configuration interface.\n\n```tsx\n<GenericWorkflowAdminConfig\n  workflow={workflow}\n  config={{\n    showStageEditor: true,\n    showTransitionEditor: true,\n    allowCreation: true,\n    allowDeletion: true\n  }}\n  onSave={(updatedWorkflow) => console.log('Saved:', updatedWorkflow)}\n/>\n```\n\n## Migration Guide (v1.0.2 → v1.1.0)\n\n### Breaking Changes\n\n**NONE** - This is a backward-compatible update. All v1.0.2 APIs remain unchanged.\n\n### New Features Available\n\nConsumers can opt-in to new react-flow features:\n\n#### Option 1: Continue Using Existing Linear Components (No Changes)\n\n```typescript\nimport { GenericWorkflowStepper } from '@bernierllc/generic-workflow-ui';\n\n// Your existing code works exactly as before\n<GenericWorkflowStepper workflow={workflow} currentStageId=\"review\" />\n```\n\n#### Option 2: Use New Graph-Based Canvas\n\n```typescript\nimport { GenericWorkflowCanvas } from '@bernierllc/generic-workflow-ui';\n\n<GenericWorkflowCanvas\n  workflow={workflow}\n  currentStageId=\"review\"\n  config={{ minimap: true, controls: true }}\n  onWorkflowChange={(updated) => setWorkflow(updated)}\n/>\n```\n\n#### Option 3: Use Enhanced Builder with Mode Toggle\n\n```typescript\nimport { GenericWorkflowBuilderV2 } from '@bernierllc/generic-workflow-ui';\n\n<GenericWorkflowBuilderV2\n  initialWorkflow={workflow}\n  initialMode=\"graph\"\n  config={{ allowModeToggle: true }}\n  onSave={({ generic, json }) => console.log('Saved:', generic)}\n/>\n```\n\n### Recommended Upgrade Path\n\n1. **Update package version**:\n   ```bash\n   npm install @bernierllc/generic-workflow-ui@^1.1.0\n   ```\n\n2. **Test existing functionality**: Run existing tests to ensure backward compatibility\n\n3. **Opt-in to new features**: Gradually adopt react-flow components where graph visualization is beneficial\n\n4. **Update documentation**: Document which workflows use linear vs graph visualization\n\n### When to Use Linear vs Graph\n\n**Use Linear Mode** when:\n- Workflow is sequential with clear progression\n- Users need simple, easy-to-understand visualization\n- Mobile-first design is required\n- Workflow has few branches or decision points\n\n**Use Graph Mode** when:\n- Workflow has complex branching or parallel paths\n- Visual workflow design is required (drag-and-drop editing)\n- Users need to see the entire workflow structure at once\n- Advanced workflow analysis is needed (cycle detection, path finding)\n\n## Examples\n\n### Example 1: Linear Workflow Visualization\n\n```tsx\nimport { GenericWorkflowStepper } from '@bernierllc/generic-workflow-ui';\n\nfunction ContentApprovalWorkflow() {\n  const workflow: GenericWorkflow = {\n    id: 'content-approval',\n    name: 'Content Approval',\n    stages: [\n      { id: 'draft', name: 'Draft', order: 0 },\n      { id: 'review', name: 'Review', order: 1 },\n      { id: 'approved', name: 'Approved', order: 2 },\n      { id: 'published', name: 'Published', order: 3 }\n    ],\n    transitions: [\n      { id: 't1', from: 'draft', to: 'review' },\n      { id: 't2', from: 'review', to: 'approved' },\n      { id: 't3', from: 'approved', to: 'published' }\n    ]\n  };\n\n  return (\n    <GenericWorkflowStepper\n      workflow={workflow}\n      currentStageId=\"review\"\n      config={{\n        orientation: 'horizontal',\n        showDescriptions: true\n      }}\n    />\n  );\n}\n```\n\n### Example 2: Graph Workflow Visualization with Drag-and-Drop\n\n```tsx\nimport { GenericWorkflowCanvas } from '@bernierllc/generic-workflow-ui';\n\nfunction VisualWorkflowEditor() {\n  const [workflow, setWorkflow] = useState<GenericWorkflow>({\n    id: 'order-processing',\n    name: 'Order Processing',\n    stages: [\n      { id: 'order-received', name: 'Order Received', order: 0 },\n      { id: 'payment', name: 'Payment', order: 1 },\n      { id: 'fulfillment', name: 'Fulfillment', order: 2 },\n      { id: 'shipped', name: 'Shipped', order: 3 }\n    ],\n    transitions: [\n      { id: 't1', from: 'order-received', to: 'payment' },\n      { id: 't2', from: 'payment', to: 'fulfillment' },\n      { id: 't3', from: 'fulfillment', to: 'shipped' }\n    ]\n  });\n\n  return (\n    <div style={{ width: '100%', height: '600px' }}>\n      <GenericWorkflowCanvas\n        workflow={workflow}\n        currentStageId=\"payment\"\n        config={{\n          minimap: true,\n          controls: true,\n          background: 'dots',\n          fitView: true,\n          snapToGrid: true,\n          gridSize: 15\n        }}\n        onWorkflowChange={(updated) => {\n          setWorkflow(updated);\n          console.log('Workflow updated:', updated);\n        }}\n        onNodeClick={(stageId) => console.log('Stage clicked:', stageId)}\n        onEdgeClick={(transitionId) => console.log('Transition clicked:', transitionId)}\n        readOnly={false}\n      />\n    </div>\n  );\n}\n```\n\n### Example 3: Mode Toggle in Builder\n\n```tsx\nimport { GenericWorkflowBuilderV2 } from '@bernierllc/generic-workflow-ui';\n\nfunction WorkflowDesigner() {\n  const handleSave = ({ generic, json }) => {\n    // Save to backend\n    fetch('/api/workflows', {\n      method: 'POST',\n      body: JSON.stringify({ workflow: generic, json })\n    });\n  };\n\n  return (\n    <GenericWorkflowBuilderV2\n      initialMode=\"graph\"\n      config={{\n        allowJSONImport: true,\n        allowJSONExport: true,\n        showJSONView: true,\n        allowModeToggle: true,\n        canvasConfig: {\n          minimap: true,\n          controls: true,\n          background: 'dots',\n          snapToGrid: true\n        }\n      }}\n      onSave={handleSave}\n    />\n  );\n}\n```\n\n### Example 4: JSON Import/Export in Graph Mode\n\n```tsx\nimport {\n  GenericWorkflowCanvas,\n  workflowToJSON,\n  jsonToWorkflow,\n  validateWorkflowJSON\n} from '@bernierllc/generic-workflow-ui';\n\nfunction WorkflowWithJSONSupport() {\n  const [workflow, setWorkflow] = useState<GenericWorkflow>(initialWorkflow);\n\n  const handleExport = () => {\n    const json = workflowToJSON(workflow);\n    const blob = new Blob([JSON.stringify(json, null, 2)], {\n      type: 'application/json'\n    });\n    const url = URL.createObjectURL(blob);\n    const a = document.createElement('a');\n    a.href = url;\n    a.download = 'workflow.json';\n    a.click();\n  };\n\n  const handleImport = async (file: File) => {\n    const text = await file.text();\n    const json = JSON.parse(text);\n\n    const validation = validateWorkflowJSON(json);\n    if (!validation.valid) {\n      alert('Invalid workflow JSON: ' + validation.errors.join(', '));\n      return;\n    }\n\n    const importedWorkflow = jsonToWorkflow(json);\n    setWorkflow(importedWorkflow);\n  };\n\n  return (\n    <div>\n      <button onClick={handleExport}>Export Workflow</button>\n      <input type=\"file\" onChange={(e) => handleImport(e.target.files[0])} />\n\n      <GenericWorkflowCanvas\n        workflow={workflow}\n        config={{ minimap: true, controls: true }}\n        onWorkflowChange={setWorkflow}\n      />\n    </div>\n  );\n}\n```\n\n## Configuration\n\n### CanvasConfig Options\n\nComplete configuration options for graph-based canvas:\n\n```typescript\ninterface CanvasConfig {\n  // Node styling\n  nodeStyle?: {\n    width?: number;              // Default: 150\n    height?: number;             // Default: 80\n    borderRadius?: number;       // Default: 8\n    backgroundColor?: string;    // Default: from theme\n    borderColor?: string;        // Default: from theme\n    fontSize?: number;           // Default: 14\n  };\n\n  // Edge styling\n  edgeStyle?: {\n    strokeWidth?: number;        // Default: 2\n    strokeColor?: string;        // Default: from theme\n    animated?: boolean;          // Default: false\n    type?: 'default' | 'straight' | 'step' | 'smoothstep';\n  };\n\n  // Canvas features\n  minimap?: boolean;             // Default: false\n  controls?: boolean;            // Default: true\n  background?: 'dots' | 'lines' | 'cross' | 'none';  // Default: 'dots'\n\n  // Layout options\n  fitView?: boolean;             // Default: true\n  snapToGrid?: boolean;          // Default: false\n  gridSize?: number;             // Default: 15\n\n  // Interaction\n  readOnly?: boolean;            // Default: false\n  nodesDraggable?: boolean;      // Default: true\n  nodesConnectable?: boolean;    // Default: true\n  elementsSelectable?: boolean;  // Default: true\n}\n```\n\n## Testing\n\nThe package includes comprehensive test coverage:\n\n- **Coverage**: 77% (statements, branches, lines, functions)\n- **Test Types**: Unit tests, integration tests, component tests\n- **Test Framework**: Jest with React Testing Library\n- **Test Files**: 15 test suites, 166 tests total\n\nRun tests:\n\n```bash\nnpm test              # Watch mode\nnpm run test:run      # Single run\nnpm run test:coverage # With coverage report\n```\n\n## TypeScript Support\n\nFull generic type support for custom metadata:\n\n```tsx\ninterface MyStageMetadata {\n  assignee?: string;\n  dueDate?: Date;\n  priority?: 'low' | 'medium' | 'high';\n}\n\ninterface MyTransitionMetadata {\n  permissions: string[];\n  requiresApproval?: boolean;\n}\n\nconst workflow: GenericWorkflow<MyStageMetadata, MyTransitionMetadata> = {\n  id: 'my-workflow',\n  name: 'My Workflow',\n  stages: [\n    {\n      id: 'review',\n      name: 'Review',\n      order: 0,\n      metadata: {\n        assignee: 'user@example.com',\n        priority: 'high'\n      }\n    }\n  ],\n  transitions: [\n    {\n      id: 't1',\n      from: 'draft',\n      to: 'review',\n      metadata: {\n        permissions: ['editor'],\n        requiresApproval: true\n      }\n    }\n  ]\n};\n```\n\n## Integration Status\n\n- **Logger**: not-applicable - Pure UI package with no backend operations\n- **Docs-Suite**: ready - Full TypeDoc documentation available\n- **NeverHub**: not-applicable - UI components do not require service discovery\n\n## See Also\n\n- [@bernierllc/content-workflow-ui](../content-workflow-ui) - Content-specific workflow wrapper\n- [@bernierllc/workflow-service](../../service/workflow-service) - Workflow orchestration service\n\n## Package Information\n\n- **Type**: UI Package\n- **Category**: Generic Workflow UI\n- **Version**: 1.1.0\n- **Test Coverage**: 77%\n- **React Version**: 19.0.0\n- **Tamagui Version**: 1.135.1\n- **react-flow Version**: @xyflow/react 12.3.5\n\n## License\n\nCopyright (c) 2025 Bernier LLC. All rights reserved.\n\nThis file is licensed to the client under a limited-use license.\nThe client may use and modify this code *only within the scope of the project it was delivered for*.\nRedistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.\n","readmeFilename":"README.md"}