{"_id":"@aaqu/fromcubes-portal-react","_rev":"56-a160aaf186e146aca4f4dbdf3fa2df1f","name":"@aaqu/fromcubes-portal-react","dist-tags":{"alpha":"0.1.0-alpha.32","latest":"0.1.0-alpha.35"},"versions":{"0.1.0-alpha.1":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.1","keywords":["node-red","react","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.1","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"d6c0a1ccf3826d6655e73ca51c768d8300dd5fa9","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.1.tgz","fileCount":9,"integrity":"sha512-7wqEH6CU8gpvzqY21eGAJ5EkUCf+PQzwgfpvC+C/MZ2fEwjSLVq5xNRaSC+sXrXWa4TfWzfshCtbiibB8pMgYw==","signatures":[{"sig":"MEUCICRTJgAxd3Ip59JFmjb/+bkQ0qN5DIRXDsBeV4w0HOn6AiEAlbgsVMoKVKrUuAKmg24xKEwBvpTvz0PYKEqJifvwC/w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292204},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"React portal node for Node-RED — server-side JSX transpilation, Monaco editor, component registry, WebSocket I/O","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.1_1773571847237_0.4626311207578073","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.2":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.2","keywords":["node-red","react","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.2","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"3f02728afc42280fe95d89fcba15d86bf3994375","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.2.tgz","fileCount":9,"integrity":"sha512-xhkWbRI7U8rVM4strNkIZvrLoCiznNrBuG+ljMUPTUasCOcsoCOUvOKqcfDSY0IQIDdWMMtuSDGHcsq3jcz1Mg==","signatures":[{"sig":"MEUCIQCFjbeQlWEWKfvKq6GhojcftM31BNm0R65dBLOfKZ9gVQIgdWWpYwsD7v1Osisx09mgImekkbM/kvuCnyycTEw8fQU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292310},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.2_1773572921389_0.5170893860786034","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.3":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.3","keywords":["node-red","react","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.3","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"33a014920174a55bc90c08d59690bd1fdbe58b22","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.3.tgz","fileCount":9,"integrity":"sha512-W4pnenBqEgaambEvr8sUa056WTctgAcbQY1ROftjHYUTEVCnSMtSDv+zDjy3HkK5aGuY+swr7n8pstmntm4Rug==","signatures":[{"sig":"MEUCIQD8+4cvBGHEJYRLk+Ry4NmPLImYjGZE92jiZE7Z5NzUxgIgNue6PszExLCb7qjO9T8DwL/UL+7/YUFUF2PjTVoywkM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":292423},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.3_1773573413907_0.9432692116826806","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.4":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.4","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.4","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"6ae153c42aec71c038e7a2b7d86aafba1386efe8","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.4.tgz","fileCount":9,"integrity":"sha512-RZt9aXTKUAaxaMHWmHWEjQ9VbiyG39sucUJWtnm+XeXxKL3Cll/+zrce9LvDX5TSJVMCKzQQ+lCYs1tMs+wZqQ==","signatures":[{"sig":"MEYCIQC1KhZSTijKReUgMd9MKQd8oyjFET8RnL3xKutzjsv2YAIhANdWmD27nvBhrgzNhSlQ+g4vd1Nkz+LxNyX4Kqu4gtvN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295559},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.4_1773574997365_0.026097644006672027","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.5":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.5","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.5","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"9e6b17b2dedef62e2794db23da43f939b4180c7c","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.5.tgz","fileCount":9,"integrity":"sha512-TW1V2RuaJl8v2GwTZpYPtRAhgLkfnAuDOw5cUF8SeWe81PENfxUOkKERAHaphHK+kFpQcExRam1dWeK0SQAEYA==","signatures":[{"sig":"MEUCIBsXCmyo+Bzr+cL62itErOqxlJAndug5iOA8eHgk7HgOAiEAy/QEmT9VK0gEGorOllAxkNvPYn5n+HRPDfil4EFjpfQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":295600},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.5_1773602213866_0.4357892819883653","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.6":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.6","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.6","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"5eb010061720173b8a465fa3fce3e54848076c69","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.6.tgz","fileCount":9,"integrity":"sha512-zuP0yWCmsDO7tFLGWgZ7d6YYwwGQJllrvKS3BMfu0W9hAvSCTVtSFrccIIg1YvChi5uG5THvHncBiVERBQsH5Q==","signatures":[{"sig":"MEUCIQD0bEV4bQ7kI1MMxLr1xZZFviWCsg+lHfQL1p+j44ElGwIgKZeU5+MErfRSf0Tdac9gShvofetA9By2qzcs/37CLO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296495},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.6_1773603633500_0.31870635086543575","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.7":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.7","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.7","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"fd856bb3e0b44908fe7244e0cedb228b6e508ade","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.7.tgz","fileCount":9,"integrity":"sha512-UWru8DUfY1ASSP64w/9IKwKWA8Oq6/0+mE6e4OTEBO8/VyJfjJZhR231hRFxD113qAV58BQjQBawoHiWHtDY1w==","signatures":[{"sig":"MEQCIF9gFf0lvWUsyS5vutbiqM5MUTjEA5JICdkCm0yZwju4AiB0gIhukURAreqgpvzV45oj6RbVYgqIRrwFz2CkAi9Udg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":296921},"engines":{"node":">=18"},"scripts":{"build":"node scripts/bundle-react.js","start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"esbuild":"0.25.0","tailwindcss":"^4.0.0","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"react":"^19.0.0","prettier":"^3.8.1","react-dom":"^19.0.0"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.7_1773605266618_0.19034356753003423","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.8":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.8","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.8","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"0204d08aedb7378a28b6932a46d51c81947062b5","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.8.tgz","fileCount":10,"integrity":"sha512-m+AcSc5rsqlvajzUq4HMeb6k4SGXJPJc3zBkZidaCdc/Uvcnz6/swV1dSo0Z59RHSnC8EvK2uykIqGnpsGUr2A==","signatures":[{"sig":"MEUCIAsNn1RzlSDmhFnF6bTAwLfMVockiNgI8Nc7p3tOZfvhAiEA8kPyIrs45J1mPVmb7MBcokXx6pJl535FyZ9Bz3XQMJI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185343},"engines":{"node":">=18"},"gitHead":"a580f201cffd837d243d24794399fae9acec7793","scripts":{"start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.8_1773918317199_0.7883882757469045","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.9":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.9","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.9","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"7f102bb7afbb67310a8c35fba21dd190eacd3339","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.9.tgz","fileCount":10,"integrity":"sha512-+TpMEmT+Ir5Q4CbkrnassbwDIwmtvTWMWVjcsfqYigADW0Ov/CtRChLjlW9mckqQwsnx0yY7E45EPj8Mba/P8Q==","signatures":[{"sig":"MEQCIBXsjBeB4eqwA2qpEIQ4+oG2+vx5AE2JEcaQWkuVRHAkAiA2CLdR0/H1gnpsXAPc95v8GuEtZTEmEjBnc6wKbQ9xtw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185418},"engines":{"node":">=18"},"gitHead":"61dfaea891d7a652798b336d1b3f0f59ff2f2be3","scripts":{"start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.9_1773920935987_0.6690759277832699","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.10":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.10","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.10","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"b216406c73972530b9213a0cc16eec7c848cfbd0","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.10.tgz","fileCount":10,"integrity":"sha512-Wt648CmObsJEkr9gF+RwU6od00+5gGA3yE1XZto+wBemU5OFL9/TMOQpCRzvosXcM05t3X3UtT1fx8Qs+ieivQ==","signatures":[{"sig":"MEYCIQC5Iqq+xP56tzJhD+5GqGGU9/tEyY3uezDi1kvTXr6cVQIhAO+zASNxLMcV5DgYGPVtDbj2vgwAGbP5cc+8Xm2hjLV7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":189876},"engines":{"node":">=18"},"gitHead":"ba8159e90b978ffe55a3c876f3eeff3755868bfa","scripts":{"start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.10_1773925909169_0.7767006305992017","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.11":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.11","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.11","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"dist":{"shasum":"a855407545e5881f9a4af19e01dcc7f599acb6d3","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.11.tgz","fileCount":10,"integrity":"sha512-1HAOo01XbTh5MIJxb04bE5FTtm3IdkZKQu4qm4TCqGUUMZavk8pwP7lOP4A2/6edac6rKgi7eejd3q+bJ3FgdQ==","signatures":[{"sig":"MEUCIC2hZ+jxrstlIw7EzpcHeH2z6uLyKohQ4VttAk48OJ7yAiEAiJ/ePwEO2DEhd72F9MSl83EobMW5AGW6rQPlSdq+SUw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":190102},"engines":{"node":">=18"},"gitHead":"530bbde9ae7e70fcbb1eec9423d73ab77b690d0f","scripts":{"start":"node-red"},"_npmUser":{"name":"aaqu","email":"aaquteam@gmail.com"},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"_npmVersion":"11.6.2","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.4.1","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.11_1773927282188_0.18122322584471995","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.12":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.12","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.12","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"946826c5894b8131b5bf6c5e3104d4fe51688882","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.12.tgz","fileCount":10,"integrity":"sha512-rLVojdSCCYMWPj8mDC+kD76ZQcZE7jYxq75H5k2ZVZdYyNSKJgtelKISPClOGVKfgQMetJ9T8+a693kYloEupw==","signatures":[{"sig":"MEYCIQDNQIiNufzkVYdazf6jkV7vecVnMy/qjOk99cC3RpYc0AIhAKs7rprr8ho8Anayt+dJoRuNBDd3dfB8m8fZj/vdYgD4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.12","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":191563},"engines":{"node":">=18"},"gitHead":"cb10be11efd87261fddeaa644b1d0c352c8b86b4","scripts":{"start":"node-red"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.0","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.12_1773948666056_0.08333835071481266","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.13":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.13","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.13","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"469beadb85c1f13ad8d8fff87484aec64c72d1e1","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.13.tgz","fileCount":13,"integrity":"sha512-HhyK3Yil9hzQCGWvtxPyX1q6InOJ0RfGdYCtu22A597frDvGRrPjAVpiEoOLVfUF76r+cm4f8rqCjzVJkidONA==","signatures":[{"sig":"MEQCIElxB2BNKk3k4HPq7i3DuXXEPzkxzDxwwFL/kqYbDsMxAiAHcqWk9PrCvSKM9Ws+hafqNdU1p3ADI5GE2PCA5MA2fA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.13","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":230474},"engines":{"node":">=18"},"gitHead":"a79b76b2167ed32107855093d818b30a352ed027","scripts":{"start":"node-red"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.0","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.13_1774513214418_0.43723439849333356","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.14":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.14","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.14","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"f1582478552634132080543ecc0dcd6fc827ff4f","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.14.tgz","fileCount":13,"integrity":"sha512-0Naxi3isnmG0VpWlA04CrQ1XiGggCBaiJJdsAENGTYQQHzQ/Thxu0rSmSa0W8Whyf762NFZcP5PoCqtH6NCiZQ==","signatures":[{"sig":"MEYCIQCW4M6OytKsOzBglSnhaqQV0NeaHccttdNXYEz8NelktwIhAMmFdQKFP66tVkXg51RgT61KTzPWeId0DEc5HlyitGIo","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.14","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":232817},"engines":{"node":">=18"},"gitHead":"3a853f06b89ce3a09ae7ce32389c2fe26ecae921","scripts":{"start":"node-red"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.0","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"node-red":"next","prettier":"^3.8.1"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.14_1774557986154_0.7529519348802569","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.15":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.15","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.15","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"b76647dea52b8968f9a5020beebf595a9db98b45","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.15.tgz","fileCount":16,"integrity":"sha512-DWNaPLUX5A1DbWe1thIT4vVCIf4xu0FYmApAKzM64Z0ddG9FlEQ6JWQ5mjy/GrQMJwClTh9LrET+nr0VUz/fkA==","signatures":[{"sig":"MEYCIQD1WxXduiQkYHVvTKQmCi4dLzdBaxgPISDUa+Ia00B30QIhAL+LApKWtZWYC6eckS0WZMZ94jE9jZL3gQheSdJ7D9Hu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.15","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251290},"engines":{"node":">=18"},"gitHead":"26da32de19167e37a276345eb0a233ec68f8eb65","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.0","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.2","node-red":"next","prettier":"^3.8.1","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.15_1774824940616_0.0015002399069907746","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.16":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.16","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.16","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"bbb40114daeaee55a1b20a18808e5d626f7d7e31","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.16.tgz","fileCount":16,"integrity":"sha512-/dDnIzFH7iG9wzHxYgYCqoAzONr3tg1kPFwFxMxvAplmYxBpAKlHGLEPxE/D/l+Hbj5rBJlDa6rBVhyQ6hJhjg==","signatures":[{"sig":"MEUCIHJ7qqwr3mYXB3mBDspeXAnmvIyEIbsTS4hWfb4XjJJNAiEAiTnopWOMT0fAcSXZ/9BpQIqugZsrlDNqTj4b9QXfDdw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.16","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":251290},"engines":{"node":">=18"},"gitHead":"5a40ec1ab85753e10148e1aa598b0d208415e04c","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.0","dependencies":{"react":"^19.2.4","esbuild":"^0.27.4","react-dom":"^19.2.4","tailwindcss":"^4.2.1","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.2","node-red":"next","prettier":"^3.8.1","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.16_1774825265089_0.2768587931549711","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.17":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.17","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.17","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"fcedd4f73fbe403d4559cad8f625ba3d87017840","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.17.tgz","fileCount":18,"integrity":"sha512-ZunBEPak6xvgWdUUMpP2k8fjSA7yiLmrX6wTSHvRbfFlLaiwfQW4bgDdcM16KrC+6wJZl7z4gLAzveVCeTtH4Q==","signatures":[{"sig":"MEUCIQCuf4agAOV4dOhpQQU8/j/7GLZwgTH+No/i2ibtPzrnJQIgLlvvOBSiWB/VN15M2w+24VBmFU9XH+v0sFbzO5/4Ivk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.17","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":263860},"engines":{"node":">=18"},"gitHead":"374461cf6f3821c7a496fcfba0170ced4ead0b84","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.4","node-red":"5.0.0-beta.4","prettier":"^3.8.2","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.17_1776020584603_0.008847194187365348","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.18":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.18","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.18","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"ce202b12e35b1f9beb3a50f1cfa96fbea108656a","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.18.tgz","fileCount":18,"integrity":"sha512-+sjF7I0kC8sa3fcIsl9WpQtys+Tbasht+uBTuMD7iY6lJa2P2nU2uOspS2J1EArXoRHQtwGUimEURhqAZ+jT8A==","signatures":[{"sig":"MEUCIQDan4b6vAFXdL4WQNeOSfYX0u8sbmbGNDDJ9ADowVnjYQIgJoOQrXqZY3R6rnL7XbfhjtXvPoPNKgQWADCiEUq5ARI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.18","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":264187},"engines":{"node":">=18"},"gitHead":"aaed21b96e7b1a7ab221c48ccf3e5b23a6748629","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.4","node-red":"5.0.0-beta.4","prettier":"^3.8.2","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.18_1776021896497_0.567769750908264","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.19":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.19","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.19","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"5f70b6f58a0de66f6f0919c2d5ea44cf5556831b","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.19.tgz","fileCount":18,"integrity":"sha512-MKxdtPpJyyZpGJbkLOMrcPop/YFXKzu3ZR3FcXeGSuqSmoNpS3pY6egp3Rw3UKlb96MQpXgE383UXKRW3CX6GQ==","signatures":[{"sig":"MEUCIQDzxAfyCEcVROw3GQbgLv6c6jw9/4LiZMSUU3ouVGhGIgIgcVU2/VsWMosZu2rOfVvBP3qAY0t34W8KWywno60U2W0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.19","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":267575},"engines":{"node":">=18"},"gitHead":"cfb2eac44bca79bc825617fea0e5517c339ab7ee","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.4","node-red":"5.0.0-beta.4","prettier":"^3.8.2","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.19_1776390602250_0.807457852530415","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.20":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.20","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.20","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"2f2815c9acbe3df3c877543ee5197e7fb68d95c8","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.20.tgz","fileCount":18,"integrity":"sha512-nswNkLkyRo63vG0wJKErfLyd6U61hcN22dKQFaNMMy3KdOymWSqVXAXbVJWlMLhzvBAITUFj4sr96wiVYRiZSQ==","signatures":[{"sig":"MEUCIFPwpv9iwhZFYbvG+RJ9IoqNhsXNzPbiut521B+3GG2KAiEA0E8R8tiq50djzWJ7bPj+LB7AkWcuZj/Esdx9OyZ6AY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.20","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":268839},"engines":{"node":">=18"},"gitHead":"3b92941c1002ca8b9936331b135c0a6f11745663","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.12.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.4","node-red":"5.0.0-beta.4","prettier":"^3.8.2","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.20_1776761195359_0.5898585912567431","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.21":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.21","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.21","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"f60e4511fc2ef28104af3ab8e7d23c0223f612fb","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.21.tgz","fileCount":18,"integrity":"sha512-SpRWHmoxcKEtn11pMTaclV5MJ2pMX0sC56xnFwvNQX6mNNq8SixVO4hSJwMvBkhHYLkMVB72ZX8pDoqewKmDrw==","signatures":[{"sig":"MEYCIQC42wwxa7TdolxlP0xr8ph2NeAvQFxBtbWiykFP6PgZvAIhAPz3nOaeJlUZAjHSqg6ffJ03bhbqeOpQxA0rcEpzrjiV","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.21","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":281694},"engines":{"node":">=18"},"gitHead":"f2481202030b84867702a1c27f73e35e447d260d","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.13.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.5","node-red":"5.0.0-beta.5","prettier":"^3.8.3","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.21_1777276105328_0.18250446307862545","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.22":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.22","keywords":["node-red","dashboard","portal","jsx","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.22","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"7cb8835a7e221961d7290fa8d04dd219471e434b","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.22.tgz","fileCount":19,"integrity":"sha512-WipAk3VtUBZFmZrg18ld4fUcDU9kCWZfyRY6ZQc+c6RJGPn79tkbrkbzm8vswD8jQRmoQJViBmYEkDrFYmZYkQ==","signatures":[{"sig":"MEQCIB/0R8aqSD+U5gSyqT5WjwodhsMh8wf+y0QvIKEieRI+AiBMuA0+v7I3X4D+hHvaXuITgN5ctcTFwvz27tSmkDZ46g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.22","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":317735},"engines":{"node":">=18"},"gitHead":"baf2e57af79efa7f088d88c17ca7d04b4051851b","scripts":{"test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"}},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.13.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.14.1","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vitest":"^4.1.5","node-red":"5.0.0-beta.5","prettier":"^3.8.3","supertest":"^7.2.2"},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.22_1777288758459_0.10720535075582927","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.23":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.23","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.23","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"2938c7c84e487a98c3e7a8d52893efcb9762b9fa","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.23.tgz","fileCount":19,"integrity":"sha512-u1CYzRVUWuPPvxqCXo8pNd+sOE3PRlDF1+6yEJcbyzG6CwB4EmUtvC6CfqueZd6wurWYYkFyAmQNnymTH0ZrXQ==","signatures":[{"sig":"MEUCIG1GgrN3ilh+SxA7sdCI+sK2UfLGS3RwPPlGpQ0coX8ZAiEAl2lnzdgtr1kMopwwKs3PjKG9lGIgHq3eZSziC+s5gDg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.23","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":393618},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"8a80e79ac04245daec2fb67a6a3829252939e9f8","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.14.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.15.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0-beta.6","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.0.0 || ^9.0.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.23_1779194515880_0.26365204965371647","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.24":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.24","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.24","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"a0ba7aaab6054ae286d03acfa4a6bdb422615798","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.24.tgz","fileCount":19,"integrity":"sha512-IcCHZjAHFRduD224XMccmjuXVrowFKySXDznlKZWUZGew/gUkdGr5JtY9na+JiHBEnETHE+9iHb1FjGVnu9bbw==","signatures":[{"sig":"MEQCIFJOg21Efc72pIRxlSUcDHcJ2Q5JVVkY4PDw4aNnutsnAiAj86tMUfV2n5x8ysoofZwTYbBw+IOuUk74GKssaqZGAQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.24","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":396685},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"5fbc28e3e45dd5556e6a0f482fcf5ffef619117f","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.17.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.16.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0-beta.6","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.0.0 || ^9.0.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.24_1781515671646_0.48160447014501906","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.25":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.25","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.25","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"11c73ca69ad2cba3317383d1c5b7d44842668bb2","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.25.tgz","fileCount":19,"integrity":"sha512-F1Vpn304ooSlHmIfEC3UKskweV5G8UECLO/yduIdrnNQ5FP39O9KQVr7YpZxh9Ug2+JjM2ObZdCqj9ZzsfwCVQ==","signatures":[{"sig":"MEQCIG51DuM5m7EX1n6jmgTviFqPdqjNWP5WlzuFnbu9oQlWAiB/nyzTs11+ylcAA42mUKlUzrz1Vx64IwaRK7yBvCxsCw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.25","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":397943},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"8372e61557d135d0dc6581d25e14b29e3ce45bd6","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.17.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.16.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.0","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0-beta.6","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.0.0 || ^9.0.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.25_1781849543288_0.5871412042648851","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.26":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.26","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.26","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"704663fabd82571769a441e73ce55cf415b1123e","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.26.tgz","fileCount":23,"integrity":"sha512-tBbBM1aTB2tBAYNJPoPM1EBQ2xRTfjBlhrz8KnpxfxdNeSOlapgTc8lsOD8yqt6F12TPZpYILpAudMgwp7fsDg==","signatures":[{"sig":"MEUCIQCzg3lByLBHQEmuNWCfSMFa2KNmrcW8RHQewIahvf51ggIgE1ESaSm7jeJuyzOWIDrYkY1zihIiyic1TXg5LkVwBYY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.26","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":393224},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"4f612049a3c1262cc39ca8b55fb019071d3ef254","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.17.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.16.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.1","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.26_1782061599224_0.8368468406123504","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.27":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.27","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.27","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"b881ed91bb7b5cd01f36ff30da77a951fedb709b","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.27.tgz","fileCount":23,"integrity":"sha512-hGlZXC4qxXJWYldYNP8Ii6EXhr/BfCvkC5hwJSKS72yjGDWT1/d83DIz1Qofv/mp/uU+o3OwDwi26ppO54BKuA==","signatures":[{"sig":"MEYCIQDfnt0SsEYKscoxm2pllulFUPcqbExtIjJgMTJbgbqwEwIhALQFeW9JqyJbWi696BmDKT2lJpPlQLNvEOGsSpUqSeer","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.27","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":393404},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"c25341ca27ddf964ec760532208c97681608047b","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.17.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.16.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.1","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.27_1782065875782_0.4049487438534718","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.28":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.28","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.28","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"f62d2bf8ba5107f640d4e94eebc8fad1434ed1af","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.28.tgz","fileCount":23,"integrity":"sha512-ZcrlF/6SHnHiFCyuhnMECWERKOhtv3UDSTHSPcNBmnB1BrQbNWi481ckUkq5dkbqLlp1ZkUZf4svfsQhiDf69A==","signatures":[{"sig":"MEUCIHiXw/gVxqzsOhUdgQNViTKbUWVhVuZ1RpW+Cb+AEDkQAiEAqxbp3cKvh+5BIe8wCMKpPtpp5jDlvzm1RMrBZOykGPo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.28","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":402458},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"0e64121ab8b22774801e7ac46a54c9026cd01d62","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.18.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.1","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.28_1783042782184_0.7399797305157358","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.29":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.29","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.29","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"97be2b61f209e09ad9be49c271b341ffc5ae1552","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.29.tgz","fileCount":23,"integrity":"sha512-j6RfSUdjzCA0oBwVIH/ZB6CL2Wg1Vs+A8F6ztsLGQbiCHtTHzfA+6HVehqomQcSGq6dI4llKKUWcAWkfMKNy2Q==","signatures":[{"sig":"MEYCIQCCxLIA9wAj6Xc0z8rwY2NF3bdBgC0K9olabhliKhr77gIhAPqTcxR+rMPIdSFMn+L/dYy62IKzsTBWM+fB4EDp1mii","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.29","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":404274},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"74175f4b48bf8d3ec62c385181ad3b2f37314b5b","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"11.18.0","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.1","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.29_1783537739071_0.4599349612102115","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.30":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.30","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.30","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://github.com/Aaqu/fromcubes-portal-react#readme","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"927fc24f3d80204de3eefde942e08f8971edd9e8","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.30.tgz","fileCount":23,"integrity":"sha512-88wOOHoFl5lTT800VBKBUzYkMCjZWhUGP64DWEU4CGYTkMt+Rsohjb8afs97raG513tHV+k4xrD/SwTmrtRWSQ==","signatures":[{"sig":"MEUCIFRtTIJ1egnEkAGlfjOjeIvG0ouGNcB6DB0F1iu0kjXtAiEAjfs8N9e3X2ASbnwtKkvzquGrCaHWebk7zeSNR3O1Zl4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.30","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":404146},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"5a11351f85f7dc9b619c0e907fd7ae0b3d1c0335","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"12.0.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.5","esbuild":"^0.28.1","react-dom":"^19.2.5","tailwindcss":"^4.2.4","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.6","node-red":"5.0.0","prettier":"^3.8.3","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.30_1783873299742_0.21410407870028814","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.31":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.31","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"name":"aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.31","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://aaqu.github.io/fromcubes-portal-react/","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"6209b73bbdeee38a2d80583459600e89f7a96be9","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.31.tgz","fileCount":23,"integrity":"sha512-juxroUJ77zOloOMvdZ44C2XXVJ1/5hJpJ3dsh/bLQq4sVYn1wpNWv03UlMur3LLmDNMHUwjPEESa9UIcIGIQFA==","signatures":[{"sig":"MEQCICxF0sxpPUVyITbqylyanMHR3uq3pN+uvXfeRVP9tZwJAiBdEbSqRPftTpFy/CskViLteu9tdRcnO9fqvQMKfXKOzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.31","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":411769},"type":"commonjs","engines":{"node":">=18.5"},"gitHead":"3d2497f4cb6e9a67e6fbcd0882cd5a22ba924193","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"12.0.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.7","esbuild":"^0.28.1","react-dom":"^19.2.7","tailwindcss":"^4.3.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.10","node-red":"5.0.1","prettier":"^3.9.5","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.31_1784051583047_0.34614760728618865","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.32":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.32","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"url":"https://github.com/Aaqu","name":"Aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.32","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://aaqu.github.io/fromcubes-portal-react/","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"d4cd3e451b86f7f1e7d42183702c129955d1853b","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.32.tgz","fileCount":23,"integrity":"sha512-OAvOsMdnkQhxUmSecL/ZTwvO5qvHqpCJZFf67Fnpde9vDzcMA8OfelV7gJhl7jjQg0zjZ5Tj/gau1G1kRnWpDQ==","signatures":[{"sig":"MEQCIDwLK9526oqTi2QIf06H1s+hvsJW0BxgHXFPPUGgUlPIAiASGrAwijDa4D/gu/OZ4gx5HhR4cE+gTnymoE/1QYsQ1Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.32","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":428667},"type":"commonjs","engines":{"node":">=18.5"},"funding":{"url":"https://ko-fi.com/L4L01UOFRG","type":"ko-fi"},"gitHead":"01b4fecf508e801c0a8bfd5907ce5a7b0caeac6d","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"12.0.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.7","esbuild":"^0.28.1","react-dom":"^19.2.7","tailwindcss":"^4.3.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.10","node-red":"5.0.1","prettier":"^3.9.5","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.32_1784059703986_0.09577875525889201","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.33":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.33","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"url":"https://github.com/Aaqu","name":"Aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.33","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://aaqu.github.io/fromcubes-portal-react/","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"bd60ece583c9cba4d9544dca47088964a7e57c7c","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.33.tgz","fileCount":23,"integrity":"sha512-Xwt1/XAXpXBvyqHD9eHfDCzlItLpJX9dYQEC3iLJpytEMJ/OwNDys6UrmIEaDSFaWYbB/dRUvnSv5YiRqssEig==","signatures":[{"sig":"MEUCIEuNp6HX+KfycjMqda1xcpkZj4mjOpROba3686IlrjrLAiEAujW1kWUjDmV9rYyoAyyFKz/oYXrIlh3t2L2HtefORk8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.33","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":412055},"type":"commonjs","engines":{"node":">=18.5"},"funding":{"url":"https://ko-fi.com/L4L01UOFRG","type":"ko-fi"},"gitHead":"9eb200a3ae7600d9ca92068e6d3fae90886407b5","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"12.0.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.7","esbuild":"^0.28.1","react-dom":"^19.2.7","tailwindcss":"^4.3.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.10","node-red":"5.0.1","prettier":"^3.9.5","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.33_1784060526659_0.3738563434951536","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.34":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.34","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"author":{"url":"https://github.com/Aaqu","name":"Aaqu"},"license":"Apache-2.0","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.34","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"homepage":"https://aaqu.github.io/fromcubes-portal-react/","bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"dist":{"shasum":"1686749dab248d14a974de1c83df19b1e2990659","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.34.tgz","fileCount":23,"integrity":"sha512-uZylibs5tV1Fb66RH4JFc7LUh+7TC2emdd9y866agdDJj7bV3SUxggVz0vE2eIQyWObYuCdxB1vrk1TExD6yyw==","signatures":[{"sig":"MEYCIQCJicrOR1c+PJZrBxW6Sdo7nbAY0czpjRuyER4YbXZkLwIhAN9jTWi/rg+8+JKohF//G+pjfRaYu+VTIOyFmu5Ypc/K","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.34","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":428640},"type":"commonjs","engines":{"node":">=18.5"},"funding":{"url":"https://ko-fi.com/L4L01UOFRG","type":"ko-fi"},"gitHead":"16a0c63bd8d15df244a2b82c757b9f74da944eed","scripts":{"docs":"jsdoc -c jsdoc.json","test":"vitest run","start":"node-red","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"node-red":{"nodes":{"portal-react":"nodes/portal-react.js"},"version":">=4.0.0"},"overrides":{"dompurify":"3.4.11"},"repository":{"url":"git+https://github.com/Aaqu/fromcubes-portal-react.git","type":"git"},"_npmVersion":"12.0.1","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","directories":{},"_nodeVersion":"24.18.0","dependencies":{"react":"^19.2.7","esbuild":"^0.28.1","react-dom":"^19.2.7","tailwindcss":"^4.3.2","monaco-editor":"^0.55.1"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"ws":"^8.21.0","jsdoc":"^4.0.5","vitest":"^4.1.10","node-red":"5.0.1","prettier":"^3.9.5","supertest":"^7.2.2","jsdoc-plugin-typescript":"^3.2.1","node-red-node-test-helper":"^0.3.4"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"_npmOperationalInternal":{"tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.34_1784067872314_0.0585257694512864","host":"s3://npm-registry-packages-npm-production"}},"0.1.0-alpha.35":{"name":"@aaqu/fromcubes-portal-react","version":"0.1.0-alpha.35","description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","type":"commonjs","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"node-red":{"version":">=4.0.0","nodes":{"portal-react":"nodes/portal-react.js"}},"engines":{"node":">=18.5"},"dependencies":{"esbuild":"^0.28.1","monaco-editor":"^0.55.1","react":"^19.2.7","react-dom":"^19.2.7","tailwindcss":"^4.3.2"},"peerDependencies":{"ws":"^8.21.0"},"peerDependenciesMeta":{"ws":{"optional":false}},"devDependencies":{"jsdoc":"^4.0.5","jsdoc-plugin-typescript":"^3.2.1","node-red":"5.0.1","node-red-node-test-helper":"^0.3.4","prettier":"^3.9.5","supertest":"^7.2.2","vitest":"^4.1.10","ws":"^8.21.0"},"overrides":{"dompurify":"3.4.11"},"scripts":{"start":"node-red","test":"vitest run","test:watch":"vitest","docs":"jsdoc -c jsdoc.json"},"repository":{"type":"git","url":"git+https://github.com/Aaqu/fromcubes-portal-react.git"},"bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"homepage":"https://aaqu.github.io/fromcubes-portal-react/","funding":{"type":"ko-fi","url":"https://ko-fi.com/L4L01UOFRG"},"license":"Apache-2.0","author":{"name":"Aaqu","url":"https://github.com/Aaqu"},"publishConfig":{"access":"public"},"gitHead":"65fdc9b6c1482462f56b4c9e285c68353a196e18","_id":"@aaqu/fromcubes-portal-react@0.1.0-alpha.35","_nodeVersion":"24.18.0","_npmVersion":"12.0.1","dist":{"integrity":"sha512-AiwzIB9vS3lNbEZ41XBTA7MMbhusgw4iQ4WnqH1ru47KxYIfjeJApQgc5FEcQIexBqqD2JUPSkmhVscyR0WMHQ==","shasum":"362de0a3350295e9b34675c02a05a4dc30d96cb1","tarball":"https://registry.npmjs.org/@aaqu/fromcubes-portal-react/-/fromcubes-portal-react-0.1.0-alpha.35.tgz","fileCount":23,"unpackedSize":432521,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@aaqu%2ffromcubes-portal-react@0.1.0-alpha.35","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGWE230aqhDalDoAMKz6VilrzclAvhxB/YbsGBBld1l1AiEAjCinpLmwnDV/9wMWYGOs4XjNOZA0egP15oCzbx2SoeE="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:ceebe9af-356c-4d94-bcd3-da978cc5669f"}},"directories":{},"maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fromcubes-portal-react_0.1.0-alpha.35_1784319511605_0.4363301505994772"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-15T10:50:47.157Z","modified":"2026-07-17T20:18:32.035Z","0.1.0-alpha.1":"2026-03-15T10:50:47.397Z","0.1.0-alpha.2":"2026-03-15T11:08:41.573Z","0.1.0-alpha.3":"2026-03-15T11:16:54.060Z","0.1.0-alpha.4":"2026-03-15T11:43:17.516Z","0.1.0-alpha.5":"2026-03-15T19:16:54.087Z","0.1.0-alpha.6":"2026-03-15T19:40:33.654Z","0.1.0-alpha.7":"2026-03-15T20:07:46.773Z","0.1.0-alpha.8":"2026-03-19T11:05:17.350Z","0.1.0-alpha.9":"2026-03-19T11:48:56.147Z","0.1.0-alpha.10":"2026-03-19T13:11:49.312Z","0.1.0-alpha.11":"2026-03-19T13:34:42.330Z","0.1.0-alpha.12":"2026-03-19T19:31:06.230Z","0.1.0-alpha.13":"2026-03-26T08:20:14.563Z","0.1.0-alpha.14":"2026-03-26T20:46:26.341Z","0.1.0-alpha.15":"2026-03-29T22:55:40.798Z","0.1.0-alpha.16":"2026-03-29T23:01:05.241Z","0.1.0-alpha.17":"2026-04-12T19:03:04.777Z","0.1.0-alpha.18":"2026-04-12T19:24:56.647Z","0.1.0-alpha.19":"2026-04-17T01:50:02.400Z","0.1.0-alpha.20":"2026-04-21T08:46:35.497Z","0.1.0-alpha.21":"2026-04-27T07:48:25.471Z","0.1.0-alpha.22":"2026-04-27T11:19:18.609Z","0.1.0-alpha.23":"2026-05-19T12:41:56.097Z","0.1.0-alpha.24":"2026-06-15T09:27:51.797Z","0.1.0-alpha.25":"2026-06-19T06:12:23.421Z","0.1.0-alpha.26":"2026-06-21T17:06:39.379Z","0.1.0-alpha.27":"2026-06-21T18:17:55.917Z","0.1.0-alpha.28":"2026-07-03T01:39:42.375Z","0.1.0-alpha.29":"2026-07-08T19:08:59.203Z","0.1.0-alpha.30":"2026-07-12T16:21:39.892Z","0.1.0-alpha.31":"2026-07-14T17:53:03.188Z","0.1.0-alpha.32":"2026-07-14T20:08:24.128Z","0.1.0-alpha.33":"2026-07-14T20:22:06.869Z","0.1.0-alpha.34":"2026-07-14T22:24:32.493Z","0.1.0-alpha.35":"2026-07-17T20:18:31.755Z"},"bugs":{"url":"https://github.com/Aaqu/fromcubes-portal-react/issues"},"author":{"name":"Aaqu","url":"https://github.com/Aaqu"},"license":"Apache-2.0","homepage":"https://aaqu.github.io/fromcubes-portal-react/","keywords":["node-red","dashboard","portal","jsx","react","tailwind","websocket","fromcubes"],"repository":{"type":"git","url":"git+https://github.com/Aaqu/fromcubes-portal-react.git"},"description":"Fromcubes Portal - React for Node-RED with Tailwind CSS and auto complete","maintainers":[{"name":"aaqu","email":"aaquteam@gmail.com"}],"readme":"# @aaqu/fromcubes-portal-react\n\n[![npm version](https://img.shields.io/npm/v/%40aaqu%2Ffromcubes-portal-react.svg)](https://www.npmjs.com/package/@aaqu/fromcubes-portal-react)\n[![npm downloads](https://img.shields.io/npm/dm/%40aaqu%2Ffromcubes-portal-react.svg)](https://www.npmjs.com/package/@aaqu/fromcubes-portal-react)\n[![node](https://img.shields.io/node/v/%40aaqu%2Ffromcubes-portal-react.svg)](https://www.npmjs.com/package/@aaqu/fromcubes-portal-react)\n[![Node-RED](https://img.shields.io/badge/Node--RED-%E2%89%A5%204.0-8f0000.svg)](https://nodered.org)\n[![license](https://img.shields.io/npm/l/%40aaqu%2Ffromcubes-portal-react.svg)](./LICENSE)\n[![Discord](https://img.shields.io/badge/Discord-join%20chat-5865F2?logo=discord&logoColor=white)](https://discord.gg/KYzsfKkYxX)\n\n**📖 Documentation — step-by-step guide with screenshots:** [aaqu.github.io/fromcubes-portal-react](https://aaqu.github.io/fromcubes-portal-react/) — install → import → edit JSX → live dashboard, on one example.\n\n[![Documentation walkthrough](https://aaqu.github.io/fromcubes-portal-react/img/docs-scroll.gif)](https://aaqu.github.io/fromcubes-portal-react/)\n\n> **⚠️ Alpha Module** — This project is in early development. Expect breaking changes. Test on a clean Node-RED instance.\n\nA Node-RED node that turns any `/fromcubes/<sub-path>` URL into a React page. Write JSX in the editor, deploy, open the URL — your component talks to the flow over WebSocket. No build step, no browser compiler. All portal pages are served under the hardcoded `/fromcubes/` prefix so every node cleanly coexists under one URL tree.\n\nFor internals, plugin authoring, and the deploy pipeline see [README-DEV.md](./README-DEV.md).\n\n**💬 Questions, feedback, showcase?** Join the [fromcubes Discord](https://discord.gg/KYzsfKkYxX).\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/L4L01UOFRG)\n\n## Prerequisites\n\n- **Node-RED ≥ 4.0** — declared in `package.json`'s `node-red.version` and\n  enforced by the editor's Palette Manager.\n- **Node.js ≥ 18.5** — Node-RED 4.x's effective minimum.\n- **npm** — only required when you use the `libs` config field to install\n  user packages at deploy time. The portal itself does not need `npm`\n  available at runtime.\n- A WebSocket-capable reverse proxy or direct connection — the portal\n  upgrades `/fromcubes/<sub-path>/_ws`. If you front Node-RED with nginx /\n  Traefik / Caddy, enable `Upgrade: websocket` headers on that path.\n\n## Install\n\n```bash\ncd ~/.node-red\nnpm install @aaqu/fromcubes-portal-react@alpha\n# restart Node-RED\n```\n\nThat's it. No build step. Any npm packages you list in the node config (e.g. `d3, three`) are installed automatically on deploy.\n\n## Your first portal\n\n1. Drop a **portal-react** node onto a flow.\n2. Set **Sub-path** to e.g. `hello` (the node will serve at `/fromcubes/hello`; the `/fromcubes/` prefix is fixed).\n3. Open the code editor and paste:\n   ```jsx\n   function App() {\n     const { data, send } = useNodeRed();\n     return (\n       <div className=\"p-4\">\n         <p>From flow: {JSON.stringify(data)}</p>\n         <button\n           className=\"px-3 py-1 bg-blue-500 text-white rounded\"\n           onClick={() => send({ clicked: Date.now() })}\n         >\n           click me\n         </button>\n       </div>\n     );\n   }\n   ```\n4. Deploy. Open `http://localhost:1880/fromcubes/hello`.\n5. Wire an **inject** node into the portal-react input → see `data` update live. Wire its output → see button clicks arrive in your flow.\n\n## The `useNodeRed()` hook\n\nEverything your component needs from the flow lives in one hook:\n\n```jsx\nconst {\n  data,          // last broadcast msg.payload from input wire (reactive)\n  send,          // send(payload, topic?) — emit msg on output wire\n  user,          // portal user object (when Portal Auth is enabled), or null\n  portalClient,  // unique session/tab ID assigned by server on connect\n  authRequired,  // true when this session is anonymous on an authenticated-only portal\n} = useNodeRed();\n```\n\n### Initial data on connect\n\nThe server does **not** cache payloads — a freshly-loaded page has `data === null` until the flow pushes the next message. For periodic streams that's at most one interval of blankness. For event-driven or per-user data, request the initial state from the component:\n\n```jsx\nconst { data, send } = useNodeRed();\nuseEffect(() => { send({}, \"init\"); }, []);\n```\n\nIn the flow, catch `topic === \"init\"`, look up the state (per-user via `msg._client.userId` if needed) and reply — `msg._client` is already set on the inbound message, so the response returns as a unicast to exactly that tab.\n\n## Node configuration\n\n| Field | Purpose |\n|---|---|\n| Sub-path | Part after `/fromcubes/`, e.g. `page1` → served at `/fromcubes/page1`. Required. Nesting allowed (`team/alpha`). Reserved: `public`, `_ws`. |\n| Page Title | Browser tab title |\n| npm Packages | Comma-separated, e.g. `d3, three, @react-three/fiber` |\n| Portal Auth | Enable portal user header extraction (see Multi-user) |\n| Authenticated-only delivery | Untargeted msgs (no `msg._client`) go only to sessions with portal identity headers; anonymous sessions get an `auth_required` frame on connect (see Multi-user). Off by default. |\n| Show WS status | Small \"fromcubes • connected/disconnected\" badge in the page's bottom-right corner (off by default) |\n| Head HTML | Extra trusted-author `<head>` tags (CDN, fonts, CSS, scripts). Runs in the public portal page. |\n| Code Editor | Monaco with JSX — must define `<App />` |\n\nThere is also a config node, **fc-portal-component**, that lets you define reusable React components once and reference them by name from any portal-react node. Referenced components (and their transitive dependencies) are injected at transpile time, so unused ones add nothing to the bundle.\n\nFor shared **non-component** code (helpers, custom hooks, constants), use **fc-portal-utility** — a sibling config node. Unlike component nodes (which export exactly one symbol via an IIFE wrapper), a utility node is injected raw at top level so it can declare any number of `function` / `const` / `let` / `class` symbols. Selective inclusion: a utility node lands in a portal's bundle only when the portal's JSX or any of its referenced library components mentions at least one of the symbols declared in that utility.\n\n```jsx\n// fc-portal-utility, Module name = mathHelpers\nconst PI2 = Math.PI * 2;\nfunction clamp(n, min, max) { return Math.max(min, Math.min(max, n)); }\nfunction useDebounce(value, ms = 300) {\n  const [v, setV] = React.useState(value);\n  React.useEffect(() => {\n    const t = setTimeout(() => setV(value), ms);\n    return () => clearTimeout(t);\n  }, [value, ms]);\n  return v;\n}\n\n// portal-react, JSX tab\nfunction App() {\n  const { data } = useNodeRed();\n  const slow = useDebounce(data?.value);\n  return <div>{clamp(slow ?? 0, 0, 100)}</div>;\n}\n```\n\n## Editor features\n\n- **Monaco** with full JSX support and `useNodeRed()` type declarations\n- **Tailwind CSS autocompletion** inside `className=\"...\"` (~19k utility classes). Classes must be complete literals in a string — dynamic `bg-${tone}-500` generates no CSS (use a map of full classes). Arbitrary values incl. `w-[calc(100%-2rem)]`, `grid-cols-[repeat(2,1fr)]`, `mt-0!` and `@md:flex` are supported.\n- **JSX tag completion** — type tag name, Tab to expand\n- **Self-close collapse** — type `/` inside empty `<tag></tag>` to convert to `<tag />`\n- **Ctrl+D / Cmd+D** — duplicate the current line or selection (in every Monaco editor of the package)\n- **Ctrl+/ / Cmd+/** — JSX-aware comment toggle. Style follows the first selected line (VS Code behavior): selecting a whole `return ( … )` block gives plain `//` on every line, while lines between live JSX tags are wrapped in `{/* … */}` (a plain `//` there is literal text — JSX renders it on the page)\n- **Component completion** — registry components + any PascalCase word\n- **Utility-symbol completion** — top-level identifiers from any `fc-portal-utility` node, suggested in JS context\n- **Components / Utilities dialogs** — buttons in the JSX tab; Components inserts `<Tag></Tag>`, Utilities expands to the symbols declared in each node and inserts the bare identifier on click\n- **Portal Assets sidebar** — file manager for static assets (GLB, textures, fonts…)\n\n## Multi-user / Multi-tenancy\n\nPortal-react has four routing modes — broadcast, auth-cast (every authenticated session), user-cast (every tab of one user), and unicast (one specific tab). Everything works without authentication too — user-cast and auth-cast just degrade gracefully when there is no user.\n\n### Identity\n\n| Identifier | Scope | Persistence | Source |\n|---|---|---|---|\n| `portalClient` | Single WS session (one tab) | Lost on reconnect — server assigns a new UUID | Generated server-side on connect |\n| `userId` / `username` | All sessions of a user | Survives reconnect and new tabs | `x-portal-user-*` headers (when **Portal Auth** is enabled) |\n\n**Portal Auth header contract** — injected by an upstream reverse proxy such as `aaqu-portal-auth`:\n\n| Header | Field |\n|---|---|\n| `x-portal-user-id` | `userId` |\n| `x-portal-user-name` | `userName` |\n| `x-portal-user-username` | `username` |\n| `x-portal-user-email` | `email` |\n| `x-portal-user-role` | `role` |\n| `x-portal-user-groups` | `groups` (JSON array) |\n\nIf Portal Auth is disabled or headers are absent, `user` is `null` and user-scoped features are silently skipped — broadcast and per-session features still work.\n\n### Routing modes\n\nEvery inbound `msg` arrives in your flow with `msg._client` already filled in by the server. The flow then decides where the response should go by setting (or clearing) `msg._client` on the outgoing `msg`:\n\n```javascript\n// BROADCAST — everyone connected to this endpoint\ndelete msg._client;\nreturn msg;\n\n// UNICAST — only the tab that sent the original msg (echo)\n// Keep msg._client as-is; it already carries portalClient.\nreturn msg;\n\n// UNICAST — a specific tab whose ID you know\nmsg._client = { portalClient: \"a1b2c3d4-...\" };\nreturn msg;\n\n// USER-CAST — every tab of a specific user (even ones that just opened)\nmsg._client = { userId: \"alice\" };\nreturn msg;\n\n// AUTH-CAST — every session that arrived with x-portal-user-* identity;\n// anonymous sessions (no proxy headers) are skipped\nmsg._client = { authenticated: true };\nreturn msg;\n```\n\n**Auth-cast vs broadcast.** Broadcast reaches every connected client, including anonymous ones. Auth-cast reaches only sessions that arrived with `x-portal-user-*` identity headers. Use auth-cast for data that any logged-in user may see; use broadcast only for data that is genuinely public. Nothing is cached server-side — each mode delivers to the clients connected at send time.\n\n### Authenticated-only delivery (fail-safe default)\n\nWith the **Authenticated-only delivery** checkbox enabled on the node, an untargeted `msg` (no `msg._client`) is delivered as an **auth-cast** instead of a broadcast — a forgotten `_client` then narrows delivery to logged-in sessions rather than leaking to anonymous ones. A true broadcast stays available explicitly:\n\n```javascript\nmsg._client = { authenticated: false };  // deliberate broadcast, anonymous included\nreturn msg;\n```\n\nAnonymous sessions are told up front: right after `hello` the server sends a single `auth_required` frame (once per connection — never per skipped message, so unauthenticated clients learn nothing about traffic volume or timing). The hook exposes it so the page can render a login hint instead of staying silently empty:\n\n```jsx\nconst { data, authRequired } = useNodeRed();\nif (authRequired) return <p className=\"p-4 text-zinc-500\">Log in to see this data.</p>;\n```\n\n**Anti-spoof guarantee.** On every inbound message the server overwrites `msg._client` from scratch using the socket's own `portalClient` and the user data captured at connect. A browser cannot forge `_client` — whatever it puts there is discarded.\n\n**User-cast uses an O(1) index** so a message to `{userId: \"alice\"}` reaches every tab of Alice with a single lookup, not a scan.\n\n### Without a user (anonymous mode)\n\nIf **Portal Auth** is off (or no proxy headers arrive), everything still works:\n\n- `broadcast` and `portalClient` unicast: unchanged\n- `user`-cast: gracefully skipped (no `userId` to target)\n- `auth`-cast: delivers to nobody (no session has identity headers)\n- `useNodeRed().user` is `null`\n\nSame model as dashboard 2 — no auth required to use the node.\n\n## Portal Assets\n\nStatic files (3D models, textures, fonts, etc.) can be uploaded and served from a public endpoint.\n\n- Open the **Portal Assets** tab in the Node-RED sidebar\n- Upload files via button or drag & drop\n- Organize in folders (create, rename, move between folders)\n- Copy public path with one click — use in JSX: `/fromcubes/public/models/scene.glb`\n- Download and delete files from the context menu\n\nAll uploads require Node-RED admin authentication. Files are served publicly at `/fromcubes/public/`.\n\nLimits: 100 MB per file, 500 MB total, 1000 files max.\n\n## Examples\n\nAvailable via **Menu → Import → Examples → @aaqu/fromcubes-portal-react**.\nEach flow includes a comment node with what to expect and the URL to open.\n\nImport **Shared Components** first — it provides the UI building blocks (Page, Header, Stat, Button, ValueBadge) referenced by the others.\n\n| Example | npm packages | Description |\n|---|---|---|\n| **Shared Components** | — | Reusable components: Page, Header, Stat, Button, ValueBadge |\n| **Sensor Portal** | — | Sensor gauge with live WebSocket data |\n| **Live Chart** | `chart.js/auto` | Live updating Chart.js charts |\n| **D3 Poland Map** | `d3` | Interactive SVG map of Poland (simulated data) |\n| **Three.js Scene** | `three`, `@react-three/fiber`, `@react-three/drei` | 3D scene with Three.js |\n| **PixiJS Sprites** | `pixi.js`, `@pixi/react` | Clickable bunny sprites with PixiJS |\n| **WebGPU Shader** | `three` | WebGPU renderer + TSL animated shaders |\n| **Utility Hooks** | — | `fc-portal-utility` demo: `useDebounce` custom hook + `clamp` helper |\n\n## Troubleshooting\n\n| Symptom | Likely cause |\n|---|---|\n| Red status \"transpile error\" + error page on the endpoint | JSX syntax error — fix code, redeploy (cache invalidates automatically) |\n| Red status \"legacy endpoint\" on deploy | Flow was saved before the `/fromcubes/` prefix became hardcoded. Open the node, set **Sub-path**, redeploy. Automatic migration is disabled to avoid silent URL changes. |\n| Red status \"bad sub-path\" | Sub-path is empty or violates the rules (no leading `/`, no whitespace, no `..`, segments must start alphanumerically, `public`/`_ws` reserved). |\n| Yellow status \"css-fail\" | Tailwind generation failed (usually an invalid class in JSX). Page still loads but unstyled. Fix the class, redeploy — the status clears on the next successful build. |\n| Code editor stays blank / `portal-react/vs/loader.js` 404s | Monaco is served live from the package's own `node_modules` at `/portal-react/vs` (no postinstall copy step). The 404 means `RED.httpAdmin` is mounted under a non-root `httpAdminRoot` the editor didn't account for, or `monaco-editor` failed to install. Reinstall the package and hard-refresh the editor (`Cmd/Ctrl-Shift-R`). |\n| `npm install @aaqu/fromcubes-portal-react` ends with `EACCES` | The Node-RED `userDir/node_modules` install path is not writable by the user running Node-RED. Re-run `npm install` from a shell with the right ownership. |\n| Browser request `/portal-react/css/<hash>.css` returns 404 | The portal's deploy hasn't produced a CSS bundle yet — open the editor, redeploy. If the URL is bookmarked from before a deploy, the hash is stale; reload the portal page itself. |\n| WebSocket reconnects in an endless loop | Reverse-proxy is not forwarding `Upgrade: websocket` on `/fromcubes/<sub-path>/_ws`. Check the proxy config — nginx needs `proxy_set_header Upgrade $http_upgrade`, Traefik needs the `websocket` middleware. |\n| `libs` packages fail to install on deploy | The user-installed npm packages declared in **Libs** install via Node-RED's `dynamicModuleList` mechanism, which needs network access from `userDir` and a writable `node_modules`. Behind a corporate proxy set `npm config set proxy …` for the Node-RED user. |\n| Page loads but `data` stays `null` | Nothing has been pushed since the page connected — payloads are not cached server-side. Push periodically, or request initial state from the component (`send({}, \"init\")` → flow replies) |\n| `user` is `null` even with Portal Auth on | Upstream proxy is not injecting `x-portal-user-*` headers |\n| Page reloads on every deploy | Expected for code changes; clients soft-reconnect with exponential backoff |\n\n## Architecture: source AND sink\n\nThe Node-RED guidelines suggest a node should \"sit at the beginning, middle\nor end of a flow — not all at once\". `portal-react` intentionally violates\nthis: every node is both a **sink** (`msg → render`) and a **source** (UI\nevent → outbound `msg`). Trade-offs:\n\n- **Pro**: one wire per portal is conceptually simpler — the same node owns\n  the page lifecycle, its WebSocket, and the routing rules.\n- **Con**: flow-error tracking only follows the `input → output` path.\n  Errors originating in the browser (e.g. a runtime exception inside a UI\n  handler) cross the WebSocket as a source-event and are **not** routed to\n  a Catch node on the same tab — they surface as a red node status and a\n  log line. This matches the Node-RED guidance for source nodes: \"produces\n  messages in response to external events\".\n\nIf you need explicit Catch-node visibility for UI-originated errors, wire\nthe portal's output through a Switch / Catch chain — a UI event landing on\n`msg.payload` is then a regular wire-level message that Catch can observe.\n\n## Security\n\nThis module is meant to run behind a trusted Node-RED instance, ideally\nbehind a reverse proxy. Highlights:\n\n- Admin write endpoints require the `Node-RED-API-Version` header (CSRF\n  protection) and a `portal-react.write` permission when `adminAuth` is\n  configured.\n- Token-bucket rate-limit (default 60 burst / 1 req/s steady) on every\n  write endpoint, tunable via `RED.settings.portalReact.rateLimit`.\n- 1 MB JSON body cap, 100 MB asset-upload cap, 500 MB / 1000 files total\n  assets quota, 1 MB WebSocket frame cap.\n- `x-portal-user-*` identity headers are trusted unconditionally — production\n  deployments **must** terminate auth at a reverse proxy that strips inbound\n  identity headers before injecting verified ones.\n\n## License\n\nApache-2.0\n","readmeFilename":"README.md"}