{"_id":"@burgan-tech/pseudo-ui","_rev":"11-dc0492bfcc4ed7f1955f049409447cbe","name":"@burgan-tech/pseudo-ui","dist-tags":{"latest":"0.8.1"},"versions":{"0.2.0":{"name":"@burgan-tech/pseudo-ui","version":"0.2.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.2.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/pseudo-ui#readme","bugs":{"url":"https://github.com/burgan-tech/pseudo-ui/issues"},"dist":{"shasum":"e97b9f66e564f8ca816ab9dad5e02cc4ee729e56","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.2.0.tgz","fileCount":128,"integrity":"sha512-sOdIR4YONKZjSvGNljM73yq6mXOSUrZ+hJ7Kew+QXUbHZuCNuNmP+ESgjyiaYWI9Fmqyawufhao5pzmUIlDOSw==","signatures":[{"sig":"MEYCIQD5X+Sa+m70A3ienfQLDaxjeMI+9gqp0hK3ANBk28EEXAIhAJGu3afyXfHqbFvrbFMJ4UGw29eeqW6EXfTpBUQIj7J2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":755113},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"c2991872631c135a572c3f52828aeda943718805","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"},"repository":{"url":"git+https://github.com/burgan-tech/pseudo-ui.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"11.6.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.2.0_1780292931338_0.17074414010877326","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@burgan-tech/pseudo-ui","version":"0.2.1","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.2.1","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/pseudo-ui#readme","bugs":{"url":"https://github.com/burgan-tech/pseudo-ui/issues"},"dist":{"shasum":"fed6830e8538692ebc7fcf41565cda85d66f69c3","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.2.1.tgz","fileCount":134,"integrity":"sha512-Ah54gc0yHodQzFF2km/RRQBFdNTTARtbhsw6nEzhzJkvDqeF39USQQP/cbMmcVpA95tdbCJARxUYgH2AOSC8zg==","signatures":[{"sig":"MEYCIQDvMXkdldVHZijslq3pB7vi5ovnldoKAHh1StPOnX7DuAIhAOHXvTUSHKw66fCB3sfoPnMVXJ1jU1VZ0jahYFP+jcXj","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":806140},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"ca9ad66c2e603dd846b9dadbd66c91aacd139e0d","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"},"repository":{"url":"git+https://github.com/burgan-tech/pseudo-ui.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"11.6.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.2.1_1780561989628_0.08355965092494078","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@burgan-tech/pseudo-ui","version":"0.2.2","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.2.2","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/pseudo-ui#readme","bugs":{"url":"https://github.com/burgan-tech/pseudo-ui/issues"},"dist":{"shasum":"5c57db3318bd9a1ad1a1b5e97961ee67b1e26060","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.2.2.tgz","fileCount":143,"integrity":"sha512-ON+3SL3IEbotfOT9k9MsrjUOXiLt3ol+ODrYygb/zKAZHsE2OscFVAj39vp6RxbZESchQwoEwd9V9SktiByhug==","signatures":[{"sig":"MEUCIQCPUN57rfw4m5y+JnkjRUQUQBG8IlTkWgzwlTiWl+qB+wIgMmcWjQGo8+kucCeZi1nFWnNpM+y0CDi3pAI/4AM8V/0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":839131},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"50271d094f9e17e0972be6b6c020513c4a5ef27a","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"},"repository":{"url":"git+https://github.com/burgan-tech/pseudo-ui.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"11.6.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.2.2_1782971792496_0.1520480168438183","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@burgan-tech/pseudo-ui","version":"0.3.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.3.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/pseudo-ui#readme","bugs":{"url":"https://github.com/burgan-tech/pseudo-ui/issues"},"dist":{"shasum":"2a3839501d2a80148bdba7b4080e23945ae6665e","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.3.0.tgz","fileCount":143,"integrity":"sha512-hcKG8DU4dUehrTMFpXyMcmC2rB/91hUR7Ryfel/DQ3LygUhGz2Qqjv0o74xZqNb9vzRnIYbAFfgq4u5teyfBcw==","signatures":[{"sig":"MEUCIQD+bMlItZJkgYPSczvVJ6gpygSwyQl++GOnT+3znsiqPAIgaEmFcx3rzT0lmU6yxXlQUSBlg+kbdDrd9IdtXFFaI3k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":839131},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"50271d094f9e17e0972be6b6c020513c4a5ef27a","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"},"repository":{"url":"git+https://github.com/burgan-tech/pseudo-ui.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"11.6.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"24.13.0","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.3.0_1782976748356_0.9553936914140062","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@burgan-tech/pseudo-ui","version":"0.4.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.4.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"7d6d4e0713fa2b2e0bb4e97aa3a6853d0b060f59","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.4.0.tgz","fileCount":167,"integrity":"sha512-RvmIdZmijJDIivjDJYJ5RbUmoDjtG9JdQ1M9pLo+FBt8IarBEpq4jvhCWoO4iuU9YSeX1lCWmvML3jx46XbeVA==","signatures":[{"sig":"MEUCIQDdXHRkY8NPBBOxKXUhWZvFRi1L8ENvfyuSnISgoRL9uAIgbuWNc6QK4ocuokjVydzQn/Qt8+rjlOVUG4Jh9peKbuI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1010102},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"966a70b207b8f75e91f9a07e7cf0f91f56215feb","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.0.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.4.0_1786554733137_0.8767272867949778","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@burgan-tech/pseudo-ui","version":"0.5.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.5.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"094d0879788fd34a22bd2f5510e9a3ac6849c75b","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.5.0.tgz","fileCount":215,"integrity":"sha512-qV9jmXbaXSSjBoJf0+Cqpx1ZRlYLDDdm2R5CXlfnTBcT/IEuZXMQjoTzkEh7hM2OLZt8dQMz9tsoyuwuPpVJ5g==","signatures":[{"sig":"MEYCIQCxpLQozTvgyBXnNJgcibXyxFfTFMabTVHr20z7lbmYCAIhAJhwEgUAKoMrMEhFZvbF3BVH3wQngV8mrLh1J5pZzuxN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1438750},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"bb67b309feab68f199770589a4b822bc711e0e1f","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.0.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.5.0_1788877052870_0.8790568585431366","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@burgan-tech/pseudo-ui","version":"0.6.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.6.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"b30dbad56b51c3e3f2736e9ec52cc8aa25f354b0","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.6.0.tgz","fileCount":217,"integrity":"sha512-/zcAsJxnZ6DFsKEMMPpdFRSZXIV5k7QGpPAie+jrTb2moU1zvH1lOCQlOUDa0x5eNmFQWHri2GGeBzScQKV6hQ==","signatures":[{"sig":"MEYCIQDCcXeXNf3g8PNlpyiObA0nOzsjv3AQl3DQ+eajVl65XgIhANducNAg5sBw7iKgLGzVGTIGrdPJ0PS19QucRdDYbPcc","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1458046},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"d6fd2096f26c99aa0381f1c6a5729b78ed1a5f18","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.0.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.6.0_1789394252957_0.4853649532816977","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@burgan-tech/pseudo-ui","version":"0.7.1","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.7.1","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"1b0065ac1e0d736b537235cdf633d043395100ef","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.7.1.tgz","fileCount":221,"integrity":"sha512-OBERTrdCDEcN1vT8WTLFlHU3BdB8YhEl8RjgYz//ZSxyN6y7FHFiSIMGIbGdPMD7w7JS/oig8zUnLbK+kWI0OQ==","signatures":[{"sig":"MEUCIQDNoOah3dNyrRfTEfkJ2Z25gpgBlPaUuSju7sbW9Xes3QIgBXbs7egriSyjF3B3wUgvAK7a9llkXwr91TpCI0Nf21M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1780995},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"3369253a466a74a259c36754a7c2d83aeaebdf07","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.0.2","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.7.1_1789633320964_0.9092310391767655","host":"s3://npm-registry-packages-npm-production"}},"0.7.4":{"name":"@burgan-tech/pseudo-ui","version":"0.7.4","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.7.4","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"796c8130b6cee23c81b27b288e8f4a1a1c1680d2","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.7.4.tgz","fileCount":225,"integrity":"sha512-EZbGJZWtSWsKOvXoI5Cd/y4LlGIfbrxroAnwqpeXIMwuhFMN2C+SoL4+fcQITDiU1E22KFPedQF8rd3cImtOzA==","signatures":[{"sig":"MEYCIQDy3eswg4/KLuc4QfbbrTrLJBHzUklrlYAELNbEe7mlngIhANYMfolzroPcaetwPl0YehPR6HVIz/rXv3te1MmpZ+SW","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDz3lWmo76EST/CVRXOz29OypEVugOvda0UftE0NFWktwIgeYnX/S01FFJI0TmAFW9YEGQQU/H3ot4qz87PPJThS7Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1837250},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"e992825b2e5822b76de87e9727e97812d98af855","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.1.0","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.7.4_1790242032189_0.49097518998569956","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@burgan-tech/pseudo-ui","version":"0.8.0","license":"MIT","_id":"@burgan-tech/pseudo-ui@0.8.0","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"06ab68fec3a893bf667d20ff6882768033b36641","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.8.0.tgz","fileCount":229,"integrity":"sha512-3V4a7ElX1zsunYQX6eRLRtfmlJy6G9cEJu8u1mimLpCFNTDJT3qHmlT9YN1SFQn7OtKRLqQN6YsiBXkeUlfDqg==","signatures":[{"sig":"MEYCIQCCTGS6UHSLfMpnF4Cfqyzz2kK7BrGgXaoRF888QC47sgIhAKQbwopPUV3311NzEudQt/5KD96z7A8MDmAUouctnDIU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBkDOX0JnE6Ebmutxq3vBGcKeakq+ILUIJPJB6YVZJMXAiAX9mMmTjreI2XEg//LKShBtAwagdbsQfqNT0mr83qG5w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1850913},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"49087ab10116721e23d52dd49a9c6b6fcdde94e9","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.1.0","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/pseudo-ui_0.8.0_1790599735749_0.8178069375545622","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"_id":"@burgan-tech/pseudo-ui@0.8.1","bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"dist":{"shasum":"0b427830c6d5c0279a4e95da6b5b256b0368a5c1","tarball":"https://registry.npmjs.org/@burgan-tech/pseudo-ui/-/pseudo-ui-0.8.1.tgz","fileCount":229,"integrity":"sha512-ar8GgJJu7sd1rdlnkd6AIlU4RzKzPP9IKfMwf2g0OA6gCWMk0Z3HCUoKTvWibNprfnT6zTZUj0TwQoinumY+1A==","signatures":[{"sig":"MEUCIQC1G97iyuGBtqvhUBOFNcQBOH4TKmjq++W3/5yGpSoTbwIgbEuCl8hrvUfttinKtuLH6kHL/jx79J6FgrzYDjPqRfg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC0m31qMRYuH/5uG6PaFSZCMFYW2L9oVCxMvmRPKNIMSAIhAJYgfbIskVQieC5ThzwV1ISAkI2V+YNC879j2XdVgBTP"}],"unpackedSize":1851426},"main":"./dist/index.js","name":"@burgan-tech/pseudo-ui","type":"module","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./vue":{"types":"./dist/adapters/vue/index.d.ts","import":"./dist/adapters/vue/index.js"},"./react":{"types":"./dist/adapters/react/index.d.ts","import":"./dist/adapters/react/index.js"},"./angular":{"types":"./dist/angular/index.d.ts","import":"./dist/angular/fesm2022/pseudo-ui.mjs","default":"./dist/angular/fesm2022/pseudo-ui.mjs"},"./vue/style.js":{"types":"./dist/adapters/vue/style.d.ts","import":"./dist/adapters/vue/style.js"},"./vue/style.css":"./dist/pseudo-ui.css","./react/style.js":{"types":"./dist/adapters/react/style.d.ts","import":"./dist/adapters/react/style.js"},"./react/style.css":"./dist/pseudo-ui-react.css","./angular/style.css":"./dist/pseudo-ui-angular.css","./vocabularies/view-vocabulary.json":"./vocabularies/view-vocabulary.json","./vocabularies/view-model-vocabulary.json":"./vocabularies/view-model-vocabulary.json"},"gitHead":"f8eb779cf0d108a016583449c5eee7d07ece92e1","license":"MIT","scripts":{"lint":"eslint src/","test":"vitest run","build":"vite build && vue-tsc --declaration --emitDeclarationOnly --outDir dist && tsc -p tsconfig.react.json --emitDeclarationOnly --outDir dist && npm run build:angular && npm run copy:vocabularies && npm run copy:react-css && npm run copy:vue-css && npm run copy:angular-css","typecheck":"vue-tsc --noEmit","test:watch":"vitest","copy:vue-css":"cp src/adapters/vue/pseudo-ui-vue.css dist/pseudo-ui.css","build:angular":"ng-packagr -p ng-package.angular.json -c tsconfig.angular.json","copy:react-css":"cp src/adapters/react/pseudo-ui-react.css dist/pseudo-ui-react.css","prepublishOnly":"npm run build && npm test","sync:composites":"node ../../scripts/sync-composites.mjs","check:composites":"node ../../scripts/sync-composites.mjs --check","copy:angular-css":"cp src/adapters/angular/lib/pseudo-ui-angular.css dist/pseudo-ui-angular.css","copy:vocabularies":"mkdir -p vocabularies && cp ../../vocabularies/*.json vocabularies/"},"version":"0.8.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"28b1aa6d-886e-4938-8efc-a54a9290b6e9"}},"homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"_npmVersion":"12.1.0","description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","directories":{},"maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"_nodeVersion":"22.23.2","dependencies":{"vue":"^3.5.0","tslib":"^2.8.0","primevue":"^4.5.0","primeicons":"^7.0.0","@primeuix/themes":"^2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"rxjs":"^7.8.1","vite":"^7.3.0","react":"^19.2.6","vitest":"^4.1.0","vue-tsc":"^3.1.0","zone.js":"^0.15.0","happy-dom":"^20.8.4","react-dom":"^19.2.6","ng-packagr":"^19.2.0","primereact":"^10.9.8","typescript":"~5.8.0","@angular/cdk":"^19.2.0","@types/react":"^19.2.14","@angular/core":"^19.2.0","@vue/tsconfig":"^0.8.0","@angular/forms":"^19.2.0","@angular/common":"^19.2.0","@vue/test-utils":"^2.4.6","vite-plugin-dts":"^4.5.0","@types/react-dom":"^19.2.3","@angular/compiler":"^19.2.0","@angular/material":"^19.2.0","@vitejs/plugin-vue":"^6.0.0","@angular/animations":"^19.2.0","@vitejs/plugin-react":"^5.1.4","@angular/compiler-cli":"^19.2.0","@angular/platform-browser":"^19.2.0"},"peerDependencies":{"rxjs":"^7.8.0","react":">=18.0.0","react-dom":">=18.0.0","primereact":">=10.0.0","@angular/cdk":">=19.0.0 <21.0.0","@angular/core":">=19.0.0 <21.0.0","@angular/forms":">=19.0.0 <21.0.0","@angular/common":">=19.0.0 <21.0.0","@angular/material":">=19.0.0 <21.0.0","@angular/animations":">=19.0.0 <21.0.0","@angular/platform-browser":">=19.0.0 <21.0.0"},"peerDependenciesMeta":{"rxjs":{"optional":true},"react":{"optional":true},"react-dom":{"optional":true},"primereact":{"optional":true},"@angular/cdk":{"optional":true},"@angular/core":{"optional":true},"@angular/forms":{"optional":true},"@angular/common":{"optional":true},"@angular/material":{"optional":true},"@angular/animations":{"optional":true},"@angular/platform-browser":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/pseudo-ui_0.8.1_1790673891424_0.7902781442906124"}}},"time":{"created":"2026-06-01T05:48:51.187Z","modified":"2026-09-29T09:24:51.782Z","0.2.0":"2026-06-01T05:48:51.615Z","0.2.1":"2026-06-04T08:33:09.782Z","0.2.2":"2026-07-02T05:56:32.657Z","0.3.0":"2026-07-02T07:19:08.498Z","0.4.0":"2026-08-12T17:12:13.285Z","0.5.0":"2026-09-08T14:17:33.020Z","0.6.0":"2026-09-14T13:57:33.084Z","0.7.1":"2026-09-17T08:22:01.103Z","0.7.4":"2026-09-24T09:27:12.306Z","0.8.0":"2026-09-28T12:48:55.857Z","0.8.1":"2026-09-29T09:24:51.622Z"},"bugs":{"url":"https://github.com/burgan-tech/vnext-client-view-renderer/issues"},"license":"MIT","homepage":"https://github.com/burgan-tech/vnext-client-view-renderer/tree/develop/core/ts-pseudo-ui","repository":{"url":"git+https://github.com/burgan-tech/vnext-client-view-renderer.git","type":"git","directory":"core/ts-pseudo-ui"},"description":"Server-Driven UI rendering engine with framework adapters. JSON Schema + Pseudo UI → platform widgets.","maintainers":[{"name":"seal707","email":"mehmet.tosun@gmail.com"},{"name":"yilmaztayfun","email":"tayfun.yilmaz2@hotmail.com"}],"readme":"# @burgan-tech/pseudo-ui\n\nA **Server-Driven UI (SDUI)** rendering engine for TypeScript. Define your UI once with JSON — render it natively on any platform.\n\nThe SDK pairs a **JSON Schema** data contract with a **View JSON** component tree to produce fully interactive forms, summaries, and multi-step workflows without shipping new client code.\n\n## Features\n\n- **30+ Material Design 3 components** — TextField, Dropdown, DatePicker, TabView, Dialog, Stepper, Carousel, and more\n- **Delegate-driven architecture** — the SDK never makes HTTP calls; your app provides data via a simple interface\n- **Expression engine** — `$form`, `$instance`, `$param`, `$ui`, `$lov`, `$lookup`, `$schema`, `$item`, `$context` namespaces for dynamic value resolution\n- **Conditional engine** — `showIf` / `hideIf` / `enableIf` / `disableIf` with `allOf`, `anyOf`, `not` compound rules and 13 operators\n- **Validation engine** — JSON Schema validation (`pattern`, `format`, `minLength`, `min/max`) plus async custom validation via delegate\n- **Typing-time input constraints** — a digits-only `pattern` (`^\\d{6}$`) or `type: integer` opens a numeric keyboard and rejects non-digits as they are typed; `maxLength` (or a fixed-width pattern) caps the field. Derived from the schema, so no view-vocabulary change is needed\n- **Keyboard dismissal** — dispatching an action (submit, cancel, a descriptor) drops the focus, so the soft keyboard closes instead of covering the next surface. `select` actions keep the focus\n- **LOV & Lookup** — List-of-Values dropdowns with cascade filtering and real-time data enrichment\n- **Nested components** — reusable sub-components with isolated contexts, input contracts (`x-binding`), and two-way data flow\n- **`$ui` state** — transient UI state (dialog visibility, active tab) that never pollutes form data\n- **Accessibility** — `aria-required`, `aria-invalid`, `aria-label` on all inputs; `role=\"alert\"` on errors\n- **Error boundaries** — `Component` and `ForEach` nodes are wrapped to prevent child crashes from taking down the app\n- **Multi-language** — all labels, errors, and enum values support `{ \"en\": \"...\", \"tr\": \"...\", \"ar\": \"...\" }`\n- **View & ViewModel vocabularies** — included JSON Schema definitions for tooling and IDE auto-complete\n\n## Installation\n\n```bash\nnpm install @burgan-tech/pseudo-ui\n```\n\n### Peer dependencies\n\nThe Vue adapter requires these in your project:\n\n```bash\nnpm install vue@^3.5 primevue@^4.5 @primeuix/themes@^2 primeicons@^7\n```\n\nThe Angular adapter (`@burgan-tech/pseudo-ui/angular`, Angular Material) requires:\n\n```bash\nnpm install @angular/core@^19 @angular/common@^19 @angular/forms@^19 @angular/platform-browser@^19 \\\n  @angular/material@^19 @angular/cdk@^19 @angular/animations@^19 rxjs@^7.8\n```\n\nUse `provideAnimationsAsync()` and `provideNativeDateAdapter()` (or another `DateAdapter`) in your application config when using date pickers.\n\n## Quick Start\n\nTwo steps: first a minimal form, then we enrich it with a nested component and a dropdown. Each step is self-contained.\n\n---\n\n### Step 1: Minimal form\n\nName, surname, birth date, and a Submit button. No dropdowns, no nested components — just schema, view, and a minimal delegate.\n\n**Schema:**\n```json\n{\n  \"$schema\": \"https://amorphie.io/meta/view-model-vocabulary\",\n  \"$id\": \"urn:amorphie:res:schema:demo:quick-start\",\n  \"type\": \"object\",\n  \"required\": [\"name\", \"surname\"],\n  \"properties\": {\n    \"name\": { \"type\": \"string\", \"minLength\": 1, \"x-labels\": { \"en\": \"First Name\", \"tr\": \"Ad\" } },\n    \"surname\": { \"type\": \"string\", \"minLength\": 1, \"x-labels\": { \"en\": \"Surname\", \"tr\": \"Soyad\" } },\n    \"birthDate\": { \"type\": \"string\", \"format\": \"date\", \"x-labels\": { \"en\": \"Date of Birth\", \"tr\": \"Doğum Tarihi\" } }\n  }\n}\n```\n\n**View:**\n```json\n{\n  \"$schema\": \"https://amorphie.io/meta/view-vocabulary/1.0\",\n  \"dataSchema\": \"urn:amorphie:res:schema:demo:quick-start\",\n  \"view\": {\n    \"type\": \"Column\",\n    \"gap\": \"md\",\n    \"children\": [\n      { \"type\": \"TextField\", \"bind\": \"name\" },\n      { \"type\": \"TextField\", \"bind\": \"surname\" },\n      { \"type\": \"DatePicker\", \"bind\": \"birthDate\" },\n      { \"type\": \"Button\", \"label\": { \"en\": \"Submit\", \"tr\": \"Gönder\" }, \"variant\": \"filled\", \"action\": \"submit\" }\n    ]\n  }\n}\n```\n\n**Delegate + render:** `requestData` and `loadComponent` are never called here, so we stub them to throw. Only `onAction` matters.\n\n```vue\n<script setup lang=\"ts\">\nimport { provideDelegate } from '@burgan-tech/pseudo-ui/vue'\nimport { PseudoView } from '@burgan-tech/pseudo-ui/vue'\nimport '@burgan-tech/pseudo-ui/vue/style.css'\n\nimport type { PseudoViewDelegate, DataSchema, ViewDefinition } from '@burgan-tech/pseudo-ui'\n\nconst schema: DataSchema = {\n  $schema: 'https://amorphie.io/meta/view-model-vocabulary',\n  $id: 'urn:amorphie:res:schema:demo:quick-start',\n  type: 'object',\n  required: ['name', 'surname'],\n  properties: {\n    name: { type: 'string', minLength: 1, 'x-labels': { en: 'First Name', tr: 'Ad' } },\n    surname: { type: 'string', minLength: 1, 'x-labels': { en: 'Surname', tr: 'Soyad' } },\n    birthDate: { type: 'string', format: 'date', 'x-labels': { en: 'Date of Birth', tr: 'Doğum Tarihi' } },\n  },\n}\n\nconst view: ViewDefinition = {\n  $schema: 'https://amorphie.io/meta/view-vocabulary/1.0',\n  dataSchema: 'urn:amorphie:res:schema:demo:quick-start',\n  view: {\n    type: 'Column',\n    gap: 'md',\n    children: [\n      { type: 'TextField', bind: 'name' },\n      { type: 'TextField', bind: 'surname' },\n      { type: 'DatePicker', bind: 'birthDate' },\n      { type: 'Button', label: { en: 'Submit', tr: 'Gönder' }, variant: 'filled', action: 'submit' },\n    ],\n  },\n}\n\nconst delegate: PseudoViewDelegate = {\n  async requestData() { throw new Error('No LOV in this example — add a dropdown to trigger this') },\n  async loadComponent() { throw new Error('No nested components — add type: \"Component\" to trigger this') },\n  async onAction(action, formData) {\n    if (action === 'submit') console.log('Form submitted:', formData)\n  },\n}\n</script>\n\n<template>\n  <PseudoView :schema=\"schema\" :view=\"view\" lang=\"en\" :delegate=\"delegate\" />\n</template>\n```\n\n---\n\n### Step 2: Add a continent dropdown (nested component + LOV)\n\nWe extend the form with a **continent** field. The dropdown lives in a nested sub-component and gets its options via `requestData` — so you see both `loadComponent` (nested UI) and `requestData` (LOV data) in action. All data is inline.\n\n**Add to main schema:**\n```json\n\"continent\": { \"type\": \"string\", \"x-labels\": { \"en\": \"Continent you live in\", \"tr\": \"Yaşadığınız kıta\" } }\n```\n\n**Add to main view** (between DatePicker and Button):\n```json\n{\n  \"type\": \"Component\",\n  \"ref\": \"continent-selector\",\n  \"bind\": { \"continent\": \"$form.continent\" }\n}\n```\n\n**Sub-component schema** (continent-selector — has `x-lov`, so the SDK calls `requestData(\"get-continents\")`):\n```json\n{\n  \"$schema\": \"https://amorphie.io/meta/view-model-vocabulary\",\n  \"$id\": \"urn:amorphie:res:schema:demo:continent-selector\",\n  \"type\": \"object\",\n  \"required\": [\"continent\"],\n  \"properties\": {\n    \"continent\": {\n      \"type\": \"string\",\n      \"x-labels\": { \"en\": \"Continent you live in\", \"tr\": \"Yaşadığınız kıta\" },\n      \"x-lov\": {\n        \"source\": \"get-continents\",\n        \"valueField\": \"$.response.data.code\",\n        \"displayField\": \"$.response.data.name\"\n      }\n    }\n  }\n}\n```\n\n**Sub-component view:**\n```json\n{\n  \"$schema\": \"https://amorphie.io/meta/view-vocabulary/1.0\",\n  \"dataSchema\": \"urn:amorphie:res:schema:demo:continent-selector\",\n  \"view\": { \"type\": \"Dropdown\", \"bind\": \"continent\" }\n}\n```\n\n**Full delegate** (replace the stubs with real implementations):\n\n```vue\n<script setup lang=\"ts\">\nimport { provideDelegate } from '@burgan-tech/pseudo-ui/vue'\nimport { PseudoView } from '@burgan-tech/pseudo-ui/vue'\nimport '@burgan-tech/pseudo-ui/vue/style.css'\n\nimport type { PseudoViewDelegate, DataSchema, ViewDefinition } from '@burgan-tech/pseudo-ui'\n\nconst CONTINENTS = [\n  { code: 'eu', name: 'Europe' },\n  { code: 'as', name: 'Asia' },\n  { code: 'na', name: 'North America' },\n  { code: 'sa', name: 'South America' },\n  { code: 'af', name: 'Africa' },\n  { code: 'oc', name: 'Oceania' },\n  { code: 'an', name: 'Antarctica' },\n]\n\nconst mainSchema: DataSchema = {\n  $schema: 'https://amorphie.io/meta/view-model-vocabulary',\n  $id: 'urn:amorphie:res:schema:demo:quick-start',\n  type: 'object',\n  required: ['name', 'surname'],\n  properties: {\n    name: { type: 'string', minLength: 1, 'x-labels': { en: 'First Name', tr: 'Ad' } },\n    surname: { type: 'string', minLength: 1, 'x-labels': { en: 'Surname', tr: 'Soyad' } },\n    birthDate: { type: 'string', format: 'date', 'x-labels': { en: 'Date of Birth', tr: 'Doğum Tarihi' } },\n    continent: { type: 'string', 'x-labels': { en: 'Continent you live in', tr: 'Yaşadığınız kıta' } },\n  },\n}\n\nconst continentSchema: DataSchema = {\n  $schema: 'https://amorphie.io/meta/view-model-vocabulary',\n  $id: 'urn:amorphie:res:schema:demo:continent-selector',\n  type: 'object',\n  required: ['continent'],\n  properties: {\n    continent: {\n      type: 'string',\n      'x-labels': { en: 'Continent you live in', tr: 'Yaşadığınız kıta' },\n      'x-lov': { source: 'get-continents', valueField: '$.response.data.code', displayField: '$.response.data.name' },\n    },\n  },\n}\n\nconst mainView: ViewDefinition = {\n  $schema: 'https://amorphie.io/meta/view-vocabulary/1.0',\n  dataSchema: 'urn:amorphie:res:schema:demo:quick-start',\n  view: {\n    type: 'Column',\n    gap: 'md',\n    children: [\n      { type: 'TextField', bind: 'name' },\n      { type: 'TextField', bind: 'surname' },\n      { type: 'DatePicker', bind: 'birthDate' },\n      { type: 'Component', ref: 'continent-selector', bind: { continent: '$form.continent' } },\n      { type: 'Button', label: { en: 'Submit', tr: 'Gönder' }, variant: 'filled', action: 'submit' },\n    ],\n  },\n}\n\nconst delegate: PseudoViewDelegate = {\n  async requestData(ref, params) {\n    if (ref === 'get-continents') return { response: { data: CONTINENTS } }\n    throw new Error(`Unknown data source: ${ref}`)\n  },\n  async loadComponent(ref) {\n    if (ref === 'continent-selector') {\n      return {\n        schema: continentSchema,\n        view: { $schema: 'https://amorphie.io/meta/view-vocabulary/1.0', dataSchema: 'urn:amorphie:res:schema:demo:continent-selector', view: { type: 'Dropdown', bind: 'continent' } },\n      }\n    }\n    throw new Error(`Unknown component: ${ref}`)\n  },\n  async onAction(action, formData) {\n    if (action === 'submit') console.log('Form submitted:', formData)\n  },\n}\n</script>\n\n<template>\n  <PseudoView :schema=\"mainSchema\" :view=\"mainView\" lang=\"en\" :delegate=\"delegate\" />\n</template>\n```\n\nStep 1 gives you the basics. Step 2 shows how to add a nested component and LOV — `requestData` serves dropdown options, `loadComponent` serves the sub-component.\n\n---\n\n### Initial data (optional)\n\nYou can pass initial values when the view first renders:\n\n| Prop | Purpose |\n|---|---|\n| `formData` | Pre-fill editable fields (e.g. user draft, edit mode). Fields are bound to `$form` and can be changed by the user. |\n| `instanceData` | Backend/persisted data (e.g. read-only display, lookup filters). Used by `$instance` expressions and summary views. |\n\n```vue\n<PseudoView\n  :schema=\"schema\"\n  :view=\"view\"\n  :form-data=\"{ name: 'Jane', surname: 'Doe', birthDate: '1990-05-15' }\"\n  :instance-data=\"{ status: 'active', createdAt: '2024-01-01' }\"\n  lang=\"en\"\n  :delegate=\"delegate\"\n/>\n```\n\n`formData` is for user-editable data. `instanceData` is for backend state that drives display and lookups — both are optional and merged when the view mounts.\n\n**Form auto-seed (SDK rule):** a bound field opens on the record's value under the same key. At mount, every top-level schema property present in `instanceData` is deep-copied into the form, so hosts do not need to pass their record as `formData` to pre-fill a view. Precedence: schema `default` < `instanceData` < `formData` (an explicit draft). A later `instanceData` change fills only still-empty fields.\n\n---\n\n### Lookups (enrichment)\n\nWhen a schema property has `x-lookup`, the SDK fetches enrichment data via `requestData`. You must **activate** the lookup by listing it in the view's `lookups` array — otherwise it won't run.\n\n**Schema** (defines the lookup):\n```json\n{\n  \"branchDetail\": {\n    \"type\": \"object\",\n    \"x-lookup\": {\n      \"source\": \"get-branch-details\",\n      \"resultField\": \"$.response.data\",\n      \"filter\": [{ \"param\": \"branchCode\", \"value\": \"$param.selectedBranchCode\", \"required\": true }]\n    }\n  }\n}\n```\n\n**View** (activates it):\n```json\n{\n  \"$schema\": \"https://amorphie.io/meta/view-vocabulary/1.0\",\n  \"dataSchema\": \"urn:amorphie:res:schema:shared:branch-info\",\n  \"lookups\": [\"branchDetail\"],\n  \"view\": { ... }\n}\n```\n\nThen use `$lookup.branchDetail.address`, `$lookup.branchDetail.phone`, etc. in Text or other components. The SDK calls `requestData(source, filterParams)` when the view mounts; the delegate returns the enrichment payload.\n\n## Action Model\n\nThe SDK treats action verbs as **opaque dispatch identifiers** with three reserved exceptions. Anything else — `'transition'`, `'navigate'`, `'urn:tenant:wf:next'`, custom verbs — flows through to `delegate.onAction(verb, formData, command?)` for the host to interpret.\n\n### Reserved verbs (3, exported as `STANDARD_ACTIONS`)\n\n| Verb | SDK behaviour | `defaultValidate` | Reaches host? |\n|---|---|:---:|:---:|\n| `submit` | Runs `validateAllFields()`; blocks dispatch on any error | ✅ | ✅ if valid |\n| `select` | Sets `formData[bind]` or `uiState[bind]` from `value` (literal or `$...` expression) | – | ❌ |\n| `reset` | Clears `formData` + `errors` | – | ✅ (`'reset'` event) |\n\n### `validate` flag — make any dispatch behave like submit\n\nWorkflow transitions, save-draft buttons, custom commands often need either \"validate first\" or \"skip validation\" — independent of the verb. The `ActionDescriptor.validate` field gives view authors that switch:\n\n```ts\ninterface ActionDescriptor {\n  action: string                // verb (reserved or domain dispatch)\n  command?: string              // opaque to SDK (typically URN); a `$` expression\n                                // (e.g. `$param.submitCommand`) is resolved before dispatch\n  bind?: string                 // 'select' only\n  value?: unknown               // 'select' only\n  validate?: boolean            // override default validation behaviour\n}\n```\n\nEffective rule: `validate ?? (verb === 'submit')`.\n\n| View JSON | What the SDK does |\n|---|---|\n| `\"submit\"` | validate ✅ → dispatch on success |\n| `{ action: \"submit\", validate: false }` | dispatch without validating (save-draft) |\n| `{ action: \"dispatch\", command: \"urn:wf:back\" }` | dispatch immediately (no validation) |\n| `{ action: \"dispatch\", command: \"urn:wf:next\", validate: true }` | validate ✅ → dispatch like submit |\n| `{ action: \"urn:amorphie:wf:transition:review\", validate: true }` | same — URN can sit directly on `action` |\n| `\"reset\"` | clear form + errors, then notify host |\n| `{ action: \"select\", bind: \"$ui.dialogOpen\", value: true }` | inline UI state set (host never called) |\n\n### Domain dispatches — where the host vocabulary lives\n\n`'transition'`, `'navigate'`, `'open'`, `'cancel'` and friends are **not** reserved by the SDK. They are conventions the host owns. URN-encoded commands are preferred for resolvability:\n\n```json\n{ \"type\": \"Button\", \"label\": \"Continue\", \"action\": \"dispatch\",\n  \"command\": \"urn:amorphie:wf:account-opening:transition:next\",\n  \"validate\": true }\n```\n\nThe host's `onAction` switch resolves the URN via its own dispatch table — workflow engine, navigation router, integration call, etc. The SDK never assumes any of these systems exist.\n\n### Component → action capability\n\nBuilders / designers gate the action picker via `componentMeta.actionCapability`:\n\n```ts\nButton:     { field: 'action', reservedActions: ['submit','reset'], acceptsDispatch: true,  acceptsValidateFlag: true  }\nIconButton: { field: 'action', reservedActions: ['submit','reset'], acceptsDispatch: true,  acceptsValidateFlag: true  }\nFAB:        { field: 'action', reservedActions: ['submit'],         acceptsDispatch: true,  acceptsValidateFlag: true  }\nCard:       { field: 'action', reservedActions: ['select'],         acceptsDispatch: true,  acceptsValidateFlag: false,\n              preferredField: 'action', aliasFields: ['onTap'] }\nListTile:   { field: 'onTap',  reservedActions: ['select'],         acceptsDispatch: true,  acceptsValidateFlag: false }\nSnackbar:   { field: 'action',                                      acceptsDispatch: true,  acceptsValidateFlag: false }\n```\n\n`reservedActions` lists which SDK verbs make sense on that node. `acceptsDispatch` says \"this node can carry an opaque URN/custom dispatch\". `acceptsValidateFlag` controls whether the builder UI exposes the \"Validate form before dispatch\" checkbox. `aliasFields` documents legacy prop names that still work — `Card` accepts both `action` (preferred) and `onTap` (deprecated alias; `action` wins when both are set).\n\n### Per-item action capability (NavigationDrawer, Menu)\n\nSome nodes carry **arrays of tappable items**, each with its own action. The SDK exposes a separate `itemActionCapability` on the parent meta:\n\n```ts\nNavigationDrawer: { itemActionCapability: { itemsField: 'items', field: 'action',\n                                            reservedActions: ['select'], acceptsDispatch: true,\n                                            acceptsValidateFlag: false } }\nMenu:             { itemActionCapability: { itemsField: 'items', field: 'action',\n                                            reservedActions: ['select'], acceptsDispatch: true,\n                                            acceptsValidateFlag: false } }\n```\n\n```json\n{ \"type\": \"NavigationDrawer\",\n  \"items\": [\n    { \"label\": \"Accounts\", \"icon\": \"account_balance\",\n      \"action\": { \"action\": \"navigate\", \"command\": \"urn:forge:nav:/accounts\" } },\n    { \"divider\": true },\n    { \"header\": \"Settings\" },\n    { \"label\": \"Profile\",  \"icon\": \"person\",\n      \"action\": { \"action\": \"navigate\", \"command\": \"urn:forge:nav:/profile\" } }\n  ]\n}\n```\n\nEach item's action flows through the same `handleAction → delegate.onAction` path as top-level actions.\n\n### Host onAction template\n\n```ts\nconst delegate: PseudoViewDelegate = {\n  // ...requestData, loadComponent, onLog\n  async onAction(verb, formData, command) {\n    // Reserved verbs SDK passes through to you (when validation passed or not required):\n    if (verb === 'submit') { /* SDK already validated */ return persist(formData) }\n    if (verb === 'reset')  { /* SDK already cleared local state */ return resetRemote() }\n\n    // Domain dispatch — resolve through your URN registry\n    if (command?.startsWith('urn:amorphie:wf:')) return workflowDispatcher.dispatch(command, formData)\n    if (command?.startsWith('urn:host:nav:'))    return router.navigate(command)\n\n    // Free-form custom verbs the SDK doesn't reserve\n    if (verb === 'cancel') return closeDialog()\n\n    console.warn('Unhandled action', verb, command)\n  },\n}\n```\n\n## Shadow DOM (React)\n\nWhen the React adapter is mounted inside a Shadow DOM (e.g. for host-application style isolation), global CSS in `document.head` cannot reach the shadow tree. Pass a `renderRoot` prop and the SDK will:\n\n1. Adopt its component CSS into the shadow root via `adoptedStyleSheets`.\n2. Default PrimeReact's `appendTo` to the shadow host so overlays (Dropdown, Dialog, Toast) render in the same style scope as their triggers.\n\nPrimeReact theme and PrimeIcons CSS remain the consumer's responsibility — adopt them with the exported `adoptStylesIntoRoot` helper.\n\n```tsx\nimport { PseudoView, adoptStylesIntoRoot } from '@burgan-tech/pseudo-ui/react'\nimport primeTheme from 'primereact/resources/themes/mdc-light-indigo/theme.css?raw'\nimport primeBase from 'primereact/resources/primereact.min.css?raw'\nimport primeIcons from 'primeicons/primeicons.css?raw'\n\n// hostElement is the shadow host; shadowRoot = hostElement.shadowRoot!\nadoptStylesIntoRoot(shadowRoot, [primeTheme, primeBase, primeIcons])\n\n<PseudoView\n  schema={schema}\n  view={view}\n  delegate={delegate}\n  renderRoot={shadowRoot}\n/>\n```\n\n`primeReactConfig.appendTo` overrides the default if you need overlays elsewhere. Material Icons `@font-face` registered on the document remains accessible inside shadow roots — no extra step needed.\n\n## Designer Mode (React)\n\nThe React adapter ships an opt-in **designer mode** that turns the rendered tree into an interactive canvas for builders (Forge ViewDesigner is the primary consumer). When `<PseudoView designer />` is on, every rendered node is wrapped with a thin interaction layer that:\n\n- exposes a JSON Pointer **path** via `data-pseudo-path` (e.g. `/view/children/0/actions/1`)\n- fires `delegate.onNodeSelect(path, node)` on click and `onNodeHover` on enter/leave\n- shows a delete (×) button on the selected node → `delegate.onNodeDelete(path)`\n- accepts **HTML5 native drag-drop**:\n  - existing nodes set `dataTransfer.setData('application/x-pseudo-ui-path', path)` and resolve to `delegate.onNodeMove(fromPath, toParentPath, key, index)`\n  - palette items set `dataTransfer.setData('application/x-pseudo-ui-palette', type)` and resolve to `delegate.onNodeDropFromPalette(targetParentPath, key, index, type)`\n- highlights drop position with `--drop-before`, `--drop-after`, or `--drop-inside` modifier classes computed from cursor Y inside the hovered node\n\nSelection is **controlled** — the host owns `selectedNodePath`. Delete/move/drop are signals; the host mutates the view tree and re-passes it.\n\n### Tree mutation utilities\n\nThe SDK exports immutable JSON-Pointer-based helpers — use these instead of hand-rolling tree mutation:\n\n```ts\nimport {\n  getNodeAtPath, setNodeAtPath, removeNodeAtPath,\n  insertNodeAtPath, moveNode, canDropInto,\n} from '@burgan-tech/pseudo-ui'\n```\n\n### End-to-end example\n\n```tsx\nimport { PseudoView } from '@burgan-tech/pseudo-ui/react'\nimport { removeNodeAtPath, moveNode, insertNodeAtPath, getComponentMeta } from '@burgan-tech/pseudo-ui'\n\nconst [view, setView] = useState(initialView)\nconst [selectedPath, setSelectedPath] = useState<string>()\n\nconst delegate = {\n  // ...requestData, loadComponent, onAction, onLog\n  onNodeSelect:           p => setSelectedPath(p),\n  onNodeDelete:           p => { setView(removeNodeAtPath(view, p)); setSelectedPath(undefined) },\n  onNodeMove:             (from, toParent, key, idx) => setView(moveNode(view, from, toParent, key, idx)),\n  onNodeDropFromPalette:  (toParent, key, idx, type) => {\n    const node = { type, ...(getComponentMeta(type)?.defaultProps ?? {}) }\n    setView(insertNodeAtPath(view, toParent, key, idx, node))\n  },\n}\n\n<PseudoView\n  schema={schema}\n  view={view}\n  delegate={delegate}\n  designer\n  selectedNodePath={selectedPath}\n/>\n```\n\n### Edit canvas vs. preview pane\n\n`designer` accepts three values so a host can render an interactive canvas and a clean preview from the same view tree:\n\n| Value             | Render bypass | Canvas chrome | Drag-drop / select |\n|-------------------|:-------------:|:-------------:|:------------------:|\n| `false` / `'off'` |       –       |       –       |         –          |\n| `'preview'`       |       ✓       |       –       |         –          |\n| `true` / `'edit'` |       ✓       |       ✓       |         ✓          |\n\n`'preview'` keeps `x-conditional` visibility bypass and empty-ForEach placeholders active so the WYSIWYG matches the canvas, but renders **without** any handles, outlines or `data-pseudo-path` attributes.\n\n```tsx\n<div className=\"split\">\n  <PseudoView view={view} designer=\"edit\"    {...editorProps} />\n  <PseudoView view={view} designer=\"preview\" {...rendererProps} />\n</div>\n```\n\n### Styling the canvas chrome\n\nTwo layers of customisation, no fork needed:\n\n**1. CSS custom properties** (defined on `:root`, override anywhere in the cascade):\n\n```\n--pseudo-designer-accent          /* outline + drop-indicator colour */\n--pseudo-designer-hover-outline   /* full shorthand for the hover outline */\n--pseudo-designer-selected-outline\n--pseudo-designer-drop-indicator\n--pseudo-designer-drop-inside-bg\n--pseudo-designer-delete-bg\n--pseudo-designer-delete-color\n--pseudo-designer-delete-size\n```\n\n```css\n:root {\n  --pseudo-designer-accent: #ff6b35;\n  --pseudo-designer-delete-bg: #1a73e8;\n}\n```\n\n**2. `designerClassNames` prop** — fully replaces class names when token tweaks aren't enough:\n\n```tsx\n<PseudoView\n  designer\n  designerClassNames={{\n    node: 'my-node',                // replaces .pseudo-designer-node\n    selected: 'my-node--selected',\n    dropBefore: 'my-drop-top',\n    dropAfter:  'my-drop-bottom',\n    dropInside: 'my-drop-into',\n    deleteButton: 'my-delete-btn',\n  }}\n/>\n```\n\nThe `samples/react-pseudo-ui` JSON Editor page has a \"Designer Mode\" toggle and \"Preview Pane\" toggle wiring all of the above end-to-end — see it as the reference implementation.\n\n## Shadow DOM (Vue)\n\nThe Vue adapter follows the same model: pass a `renderRoot` prop and the SDK will adopt its component CSS into that shadow root and route PrimeVue overlays (`Dialog`, `Drawer`, `Select`, `DatePicker`) to the shadow host via their `appendTo` prop. PrimeVue theme is your responsibility.\n\n```vue\n<script setup lang=\"ts\">\nimport { ref, onMounted, useTemplateRef } from 'vue'\nimport { PseudoView, adoptStylesIntoRoot } from '@burgan-tech/pseudo-ui/vue'\n// PrimeVue Aura preset built with @primeuix/themes:\n// import Aura from '@primeuix/themes/aura'  → see PrimeVue docs\n\nconst hostRef = useTemplateRef<HTMLDivElement>('host')\nconst shadow = ref<ShadowRoot>()\n\nonMounted(() => {\n  shadow.value = hostRef.value!.attachShadow({ mode: 'open' })\n  // Adopt the PrimeVue theme into the same shadow root.\n  // (PrimeVue 4 theme CSS may use :root — normalize to :host with a regex\n  // transform when adopting, see Forge integration spec.)\n})\n</script>\n\n<template>\n  <div ref=\"host\"></div>\n  <Teleport v-if=\"shadow\" :to=\"shadow\">\n    <PseudoView\n      :schema=\"schema\"\n      :view=\"view\"\n      :delegate=\"delegate\"\n      :render-root=\"shadow\"\n    />\n  </Teleport>\n</template>\n```\n\n> The `useOverlayTarget()` composable is exported so custom DynamicRenderer extensions can forward the same `appendTo` to additional PrimeVue overlay components.\n\n## Designer Mode (Vue & Angular)\n\nThe Vue and Angular adapters ship the **same designer mode** as React, with identical semantics, the same `data-pseudo-path` JSON Pointers, the same delegate callbacks (`onNodeSelect`, `onNodeHover`, `onNodeDelete`, `onNodeMove`, `onNodeDropFromPalette`), the same drag-drop `dataTransfer` keys (`application/x-pseudo-ui-path`, `application/x-pseudo-ui-palette`), and the same three modes (`'off'` / `'preview'` / `'edit'`). Tree mutation uses the same exported utilities (`removeNodeAtPath`, `moveNode`, `insertNodeAtPath`, …). See the **Designer Mode (React)** section above for the full behaviour, mode table and styling tokens — only the prop-passing syntax differs per framework.\n\n**Vue:**\n\n```vue\n<script setup lang=\"ts\">\nimport { PseudoView } from '@burgan-tech/pseudo-ui/vue'\nimport { removeNodeAtPath, moveNode, insertNodeAtPath, getComponentMeta } from '@burgan-tech/pseudo-ui'\n\nconst view = ref(initialView)\nconst selectedPath = ref<string>()\nconst designerDelegate = {\n  // ...requestData, loadComponent, onAction, onLog\n  onNodeSelect: (p) => { selectedPath.value = p },\n  onNodeDelete: (p) => { view.value = removeNodeAtPath(view.value, p); selectedPath.value = undefined },\n  onNodeMove: (from, toParent, key, idx) => { view.value = moveNode(view.value, from, toParent, key, idx) },\n  onNodeDropFromPalette: (toParent, key, idx, type) => {\n    const node = { type, ...(getComponentMeta(type)?.defaultProps ?? {}) }\n    view.value = insertNodeAtPath(view.value, toParent, key, idx, node)\n  },\n}\n</script>\n\n<template>\n  <PseudoView\n    :schema=\"schema\"\n    :view=\"view\"\n    :delegate=\"designerDelegate\"\n    designer=\"edit\"\n    :selected-node-path=\"selectedPath\"\n  />\n</template>\n```\n\n**Angular:**\n\n```html\n<pseudo-view\n  [schema]=\"schema()!\"\n  [view]=\"view()!\"\n  [delegate]=\"designerDelegate\"\n  [designer]=\"'edit'\"\n  [selectedNodePath]=\"selectedPath()\"\n/>\n```\n\n```ts\n// In the component: mutate the view signal from the same delegate callbacks.\nreadonly designerDelegate: PseudoViewDelegate = {\n  // ...requestData, loadComponent, onAction, onLog\n  onNodeSelect: (p) => this.selectedPath.set(p),\n  onNodeDelete: (p) => { this.view.set(removeNodeAtPath(this.view()!, p)); this.selectedPath.set(undefined) },\n  onNodeMove: (from, toParent, key, idx) => this.view.set(moveNode(this.view()!, from, toParent, key, idx)),\n  onNodeDropFromPalette: (toParent, key, idx, type) =>\n    this.view.set(insertNodeAtPath(this.view()!, toParent, key, idx, { type, ...(getComponentMeta(type)?.defaultProps ?? {}) })),\n}\n```\n\nBoth adapters accept `designerClassNames` for class-name overrides and read the same `--pseudo-designer-*` CSS custom properties (shipped in `@burgan-tech/pseudo-ui/vue/style.css` and `@burgan-tech/pseudo-ui/angular/style.css`). The `samples/vue-pseudo-ui` and `samples/angular-pseudo-ui` JSON Editor pages have the same \"Designer Mode\" + \"Preview Pane\" toggles wired end-to-end.\n\n> Angular caveat: in `'edit'` mode the canvas wraps each node in a positioned `<div>` to host the chrome. CDK Overlay portals (Select, DatePicker) remain non-shadow-aware as noted below.\n\n## Theming (Angular)\n\nThe Angular adapter uses Angular Material 19 (Material Design 3) and is **not** shadow-DOM aware in this release. Theming is driven by the standard Material `--mat-sys-*` system tokens:\n\n```scss\n:root {\n  /* Tenant brand */\n  --mat-sys-primary: #FF6B35;\n  --mat-sys-on-primary: #ffffff;\n  --mat-sys-primary-container: #ffd5c0;\n\n  /* Surface */\n  --mat-sys-surface: #fafafa;\n  --mat-sys-on-surface: rgba(0, 0, 0, 0.87);\n  --mat-sys-surface-container-lowest: #ffffff;\n  --mat-sys-outline-variant: #e5e7eb;\n\n  /* Status */\n  --mat-sys-error: #d32f2f;\n  --mat-sys-on-error: #ffffff;\n}\n```\n\nFor dark mode, switch the Material prebuilt theme CSS (e.g. `@angular/material/prebuilt-themes/azure-blue.css` → `azure-blue-dark.css`) at app bootstrap or compose your own theme with `mat.theme()` SCSS mixin.\n\n### Component styles\n\nThe adapter ships a small stylesheet (`pseudo-ui-angular.css`) that defines the structural helper classes used by the renderer: icon sizes, card interaction states, tab panel layout, and the validation-error snackbar panel class.  Include it in your Angular application's global styles:\n\n```json\n// angular.json — styles array\n\"styles\": [\n  \"node_modules/@burgan-tech/pseudo-ui/angular/style.css\",\n  \"src/styles.scss\"\n]\n```\n\nor via SCSS import:\n\n```scss\n// styles.scss\n@import '@burgan-tech/pseudo-ui/angular/style.css';\n```\n\nThe stylesheet intentionally omits Angular Material theming CSS — that remains the consumer's responsibility (prebuilt theme or `mat.theme()` SCSS mixin).\n\n### Shadow DOM\n\n`adoptStylesIntoRoot` is exported from `@burgan-tech/pseudo-ui/angular` for consumers who host Angular inside a Shadow DOM (e.g. via `@angular/elements` with `ViewEncapsulation.ShadowDom`). Full CDK Overlay containment is tracked for a future release.\n\n> CDK Overlay portals (Select, DatePicker, Dialog) are not shadow-aware in this release; they portal to `document.body` and may appear outside the shadow tree if the host element is inside one.\n\n## Package Exports\n\n| Import path | Content |\n|---|---|\n| `@burgan-tech/pseudo-ui` | Core engine: types, expression resolver, schema resolver, conditional engine, builder utilities (`componentMeta`, `enumerateBindPaths`) |\n| `@burgan-tech/pseudo-ui/vue` | Vue 3 adapter (PrimeVue 4): `PseudoView`, `DynamicRenderer`, `provideDelegate`, `adoptStylesIntoRoot`, `pseudoUiVueCss`, `useOverlayTarget` |\n| `@burgan-tech/pseudo-ui/angular` | Angular 19 adapter (standalone, Angular Material): `PseudoViewComponent`, `DynamicRendererComponent`, `FORM_CONTEXT`, `PSEUDO_DELEGATE`, `adoptStylesIntoRoot` |\n| `@burgan-tech/pseudo-ui/react` | React 18+ adapter (PrimeReact 10): `PseudoView`, `DynamicRenderer`, `createFormContext`, `FormCtx`, `DelegateCtx`, `adoptStylesIntoRoot`, `pseudoUiReactCss` |\n| `@burgan-tech/pseudo-ui/vue/style.css` | Vue adapter component styles (Material Design 3 tokens) |\n| `@burgan-tech/pseudo-ui/vue/style.js` | Vue adapter component CSS as a JS string (for `adoptedStyleSheets`) |\n| `@burgan-tech/pseudo-ui/react/style.css` | React adapter component styles |\n| `@burgan-tech/pseudo-ui/react/style.js` | React adapter component CSS as a JS string (for `adoptedStyleSheets`) |\n| `@burgan-tech/pseudo-ui/angular/style.css` | Angular adapter component helper classes (icon sizes, card states, snackbar) |\n| `@burgan-tech/pseudo-ui/vocabularies/view-vocabulary.json` | View meta-schema (UI component tree definition) |\n| `@burgan-tech/pseudo-ui/vocabularies/view-model-vocabulary.json` | ViewModel meta-schema (JSON Schema x- extensions) |\n\n## Architecture\n\n```\n┌─────────────────────────────────────────────────────┐\n│                   Your Application                   │\n│                                                      │\n│  ┌──────────────┐   implements   ┌────────────────┐ │\n│  │   App.vue    │ ──────────────▶│  Delegate      │ │\n│  │              │                │  - requestData │ │\n│  │  <PseudoView │                │  - loadComponent│ │\n│  │   :schema    │                │  - onAction    │ │\n│  │   :view      │                │  - onLog       │ │\n│  │   lang=\"en\"/>│                └────────────────┘ │\n│  └──────┬───────┘                        ▲          │\n│         │ provides                       │          │\n├─────────┼────────────────────────────────┼──────────┤\n│  SDK    │                                │          │\n│         ▼                                │          │\n│  ┌─────────────────┐  ┌──────────────┐   │          │\n│  │ DynamicRenderer  │  │ Expression   │   │          │\n│  │ (recursive)      │  │ Resolver     │   │          │\n│  │                  │  ├──────────────┤   │          │\n│  │ 30+ MD3 widgets  │  │ Conditional  │   │          │\n│  │ via PrimeVue 4   │  │ Engine       │   │          │\n│  │                  │  ├──────────────┤   │          │\n│  │ ErrorBoundary    │  │ Schema       │   │          │\n│  │ for Component &  │  │ Resolver     │◀──┘          │\n│  │ ForEach          │  │ (validation) │              │\n│  └─────────────────┘  └──────────────┘              │\n└─────────────────────────────────────────────────────┘\n```\n\n## Data Model (MVVM)\n\n| Layer | File | Purpose |\n|---|---|---|\n| **ViewModel** | `schema.json` | Data contract — field types, validation, LOV sources, conditionals, multi-lang labels |\n| **View** | `view.json` | UI component tree — layout, binding, actions, transient UI state |\n| **Model** | Backend | Persisted data, served via delegate's `requestData` |\n\n## Delegate Interface\n\n```typescript\ninterface PseudoViewDelegate {\n  /** Fetch data from backend (LOV items, lookup enrichment). ref = source (required); params = resolved filter from x-lookup (optional when no filter). */\n  requestData(ref: string, params?: Record<string, string>): Promise<unknown>\n\n  /** Load a nested component's schema + view by reference */\n  loadComponent(ref: string): Promise<{ schema: DataSchema; view: ViewDefinition }>\n\n  /** Handle user actions (submit, cancel, back, custom commands) */\n  onAction(action: string, formData: Record<string, unknown>, command?: string): Promise<void>\n\n  /** Optional: custom async validation after built-in checks pass */\n  onValidationRequest?(field: string, value: unknown, formData: Record<string, unknown>): Promise<string | null>\n\n  /** Optional: capture SDK logs (debug, info, warn, error) */\n  onLog?(level: LogLevel, message: string, error?: unknown, context?: Record<string, unknown>): void\n\n  /**\n   * Optional: read this record's CHILD instances so a parent view can display\n   * their data via `$subFlow.*` / `$subProcess.*` without copying it into the\n   * parent. Only the roots the view actually references are requested.\n   * Required only if views use those roots — see\n   * docs/child-instance-read-through.md\n   */\n  loadSubInstances?(input: {\n    domain: string; workflow: string; instanceId: string\n    states: string[]; flows: string[]\n  }): Promise<SubInstanceRef[]>\n\n  /**\n   * Optional: turn a `FilePicker`'s handle into bytes — the platform half, and\n   * NOT an upload. Return `{name, mimeType, size, content}` with `content` as\n   * base64 and no `data:` prefix, or `null` when the file could not be read\n   * (the node then leaves the field empty rather than storing half a document).\n   * The gate — accepted media type, non-empty, within `maxSizeBytes` — has\n   * already run in `engine/filePicker.ts`. See below.\n   */\n  readFile?(input: FileReadRequest): Promise<PickedFileValue | null>\n}\n```\n\n### `readFile` — the file picker's platform half\n\n`FilePicker` needs one thing pure code cannot do: read a platform file handle\ninto bytes. That is all `readFile` is. **It sends nothing anywhere** — the base64\nit returns is written into form data at the picker's `bind` and the ordinary\nsubmit carries it to the backend inside the transition body, exactly like a text\nfield's string. There is no second request, no endpoint, no attachment id, and\nnone may be added: a client that could name a storage location would be a client\nthat knows where the file is stored, which is the one thing this contract must\nnever encode.\n\nOn web, use `FileReader.readAsDataURL` and cut at the comma — **not**\n`arrayBuffer()` plus a byte loop. `String.fromCharCode(...bytes)` blows the\nargument limit and throws `RangeError: Maximum call stack size exceeded` at\naround a hundred kilobytes, which is well inside the range this picker allows.\n\n```typescript\nasync function readFile(input: FileReadRequest): Promise<PickedFileValue | null> {\n  const file = input.file\n  if (!(file instanceof Blob)) return null          // an adapter bug, not a user error\n  const content = await new Promise<string | null>(resolve => {\n    const reader = new FileReader()\n    reader.onerror = () => resolve(null)\n    reader.onload = () => {\n      const r = reader.result\n      if (typeof r !== 'string') return resolve(null)\n      const comma = r.indexOf(',')\n      resolve(comma >= 0 ? r.slice(comma + 1) : null)  // drop the `data:` prefix\n    }\n    try { reader.readAsDataURL(file) } catch { resolve(null) }\n  })\n  if (content === null) return null\n  return { name: input.name, mimeType: input.mimeType, size: input.size, content }\n}\n```\n\n**Wire it once, in the host's base delegate, not per surface.** A seam nobody\nwires is a feature that does not exist: when it is missing the node reports at\n`error` naming the consequence and tells the person on screen, rather than\nleaving a control that swallows every pick.\n\n**Never log the content.** Names, types and sizes only — a base64 blob in a\nconsole line is both a leak of a customer's papers and a console nobody can\nscroll afterwards. The SDK exports `withoutFileContent` / `withoutFileContents`\nfor host log lines that carry a field value or a whole record.\n\n### Child instance read-through (`$subFlow` / `$subProcess`)\n\nA parent workflow's view can display its sub-flow / sub-process data without that\ndata ever being copied into the parent. Two things must be supplied, and **if\neither is missing nothing is fetched** — the view renders empty and logs one\nwarning:\n\n1. `loadSubInstances` on the delegate (above)\n2. `instanceRef` on `PseudoView` — `{ domain, workflow, instanceId }`, or `null`\n   on a start surface where no instance exists yet\n\n```tsx\n<PseudoView schema={schema} view={view} delegate={delegate}\n            instanceRef={{ domain: 'sample', workflow: 'north-star', instanceId: 'ns-1' }} />\n```\n\nThe load is **reference-driven**: a view with no `$sub*` binding calls nothing at\nall, and a parent with seven open children serving a view that names one fan-out\nissues three reads. Absent children suppress silently (`undefined` / `[]`), so a\nbinding can be written eagerly.\n\nThree authoring rules that bite, all covered in\n[docs/child-instance-read-through.md](../../docs/child-instance-read-through.md):\nthis engine has no `{{ }}` interpolation (compose counters from sibling `Text`\nnodes), index with `.0` not `[0]`, and `x-conditional` cannot see child data so a\nblock cannot be hidden when a fan-out is empty.\n\n## Supported Components\n\n### Page frame\n`Scaffold` (view root only — owns the top app bar and the body)\n\n### Layout\n`Column` · `Row` · `Stack` · `Grid` · `Expanded` · `SizedBox` · `Divider` · `Spacer`\n\n### Input\n`TextField` · `TextArea` · `NumberField` · `Dropdown` · `Checkbox` · `RadioGroup` · `DatePicker` · `TimePicker` · `Switch` · `Slider` · `SegmentedButton` · `SearchField` · `AutoComplete` · `ImagePicker` · `FilePicker`\n\n`FilePicker` opens the machine's own file dialog and puts the chosen document into the form. **There\nis no upload**: the file becomes base64 in the form data and travels to the backend in the ordinary\ntransition body, exactly like a text field's string — no side channel, no endpoint, no attachment id.\nThe node calls `delegate.readFile` only to turn the platform's file handle into bytes, and that seam\ntalks to no server. Label, requiredness, visibility and validation all come from the bound schema\nproperty, so a required-but-empty picker blocks submit through the same gate a required `TextField`\ndoes. The stored value is `{name, mimeType, size, content}` (base64, no `data:` prefix); the optional\n`fields` mapping renames those four keys for a backend schema that already spells them differently,\nand `multiple` asks for a set — where the bind then always holds an array. Per-file, total and count\nceilings default to 1 MiB / 4 MiB / 5 files and cannot be switched off: the base64 sits in the\ninstance data and is carried on every read of that record.\n\n### Display\n`Text` · `Image` · `Chip` · `ListTile` · `Avatar` · `RichText` · `LoadingIndicator`\n\n### Surface & Overlay\n`Card` · `Dialog` · `BottomSheet` · `SideSheet` · `Snackbar` · `Tooltip`\n\n### Navigation\n`TabView` · `AppBar` · `NavigationBar` · `NavigationDrawer`\n\n### Container\n`ExpansionPanel` · `Stepper`\n\n### Action\n`Button` · `IconButton` · `FAB` · `Menu` · `Toolbar` · `Carousel`\n\n### Control\n`ForEach` · `Component` (nested)\n\n## Expression Namespaces\n\n| Namespace | Source | Example |\n|---|---|---|\n| `$form.field` | User input data | `$form.firstName` |\n| `$instance.field` | Backend persisted data | `$instance.status` |\n| `$param.field` | Parent-bound data (nested components) | `$param.cityCode` |\n| `$ui.key` | Transient UI state (not submitted) | `$ui.showDialog` |\n| `$schema.field.label` | Schema label for current language | `$schema.city.label` |\n| `$lov.field` | LOV items array | `$lov.city` |\n| `$lov.field.display` | Localized display name for current value | `$lov.city.display` |\n| `$lookup.prop.field` | Enrichment data | `$lookup.branch.address` |\n| `$subFlow.state.…` | A child sub-flow's own data, read through without copying it into the parent | `$subFlow.precheck.data.notes` |\n| `$subProcess.flow` | A fanned-out sub-process group (array); `.length` and `.$done` read its size and how many reported back | `$subProcess.ns-notify.$done` |\n| `$item.field` | ForEach iteration item | `$item.name` |\n| `$context.lang` | Runtime context | `$context.lang` |\n\n## Conditional Operators\n\n`equals` · `notEquals` · `in` · `notIn` · `greaterThan` · `lessThan` · `greaterThanOrEquals` · `lessThanOrEquals` · `contains` · `startsWith` · `endsWith` · `isEmpty` · `isNotEmpty` · `matches` (regex)\n\nCompound rules: `allOf` (AND), `anyOf` (OR), `not` (negate) — recursive nesting supported.\n\n## Validation Formats\n\nBuilt-in `format` validators: `email` · `uri` / `url` · `date` · `date-time` · `time` · `phone` / `tel` · `iban`\n\n## Designer Mode\n\nWhen wiring this SDK into a view.json editor or preview pane, set the\n`designer` prop on `PseudoView` so structural placeholders show up even\nwhen no real data is bound:\n\n```vue\n<PseudoView :schema=\"schema\" :view=\"view\" :delegate=\"delegate\" :designer=\"true\" />\n```\n\n```tsx\n<PseudoView schema={schema} view={view} delegate={delegate} designer />\n```\n\n```html\n<pseudo-view [schema]=\"schema\" [view]=\"view\" [delegate]=\"delegate\" [designer]=\"true\" />\n```\n\nWhat changes when `designer === true`:\n\n- **`ForEach`** with an empty `source` renders its `template` once with\n  an empty `$item` — designers see the iteration shape instead of a\n  blank region.\n- **`x-conditional` visibility** (`showIf` / `hideIf`) is bypassed —\n  hidden fields render so editors can see and select them. Enabled\n  state is **preserved**, so `disableIf` / `enableIf` still produce\n  disabled styling.\n- **Validation rules are unaffected.** A submit that triggers\n  `validateAllFields` still uses the original visibility rules —\n  errors do not surface for fields that the live runtime would hide.\n\nThe flag bridges to the engine via `FormContext.designerMode`. Direct\ncontext consumers can also flip it with `createFormContext(schema, lang,\n{ designerMode: true })`.\n\n## Builder & Tooling APIs\n\nTwo engine-level utilities make it easy to build view.json editors, autocomplete UIs,\nor static analyzers without re-implementing the SDK's structural knowledge:\n\n### `componentMeta`\n\nProgrammatic catalog of every node type. Use it instead of hard-coding a parallel\nlist in your tooling — the catalog is sync-tested against `view-vocabulary.json`,\nso adding a new component anywhere in the SDK surfaces here automatically.\n\n```typescript\nimport { componentMeta, getComponentMeta, listComponentTypes } from '@burgan-tech/pseudo-ui'\n\nlistComponentTypes()\n// → ['Column', 'Row', ..., 'Button', 'TextField', ..., 'ForEach', 'Component']\n\ngetComponentMeta('TabView')\n// → {\n//     type: 'TabView',\n//     category: 'container',\n//     acceptsChildren: true,\n//     childContainerKey: 'tabs',\n//     childContainerShape: 'wrapped',   // 'flat' = ComponentNode[], 'wrapped' = TabDefinition[] etc.\n//     defaultProps: { tabs: [{ title: 'Tab 1', content: [] }] },\n//     description: 'Tabbed container...',\n//   }\n```\n\nFields: `type`, `category`, `acceptsChildren`, `childContainerKey`,\n`childContainerShape`, `defaultProps`, `bindable`, `description`.\n\n### `enumerateBindPaths`\n\nWalks a `dataSchema` and returns every reachable bind path with its metadata —\nuseful for autocomplete UIs, bind validators, and documentation generators.\n\n```typescript\nimport { enumerateBindPaths } from '@burgan-tech/pseudo-ui'\n\nenumerateBindPaths(schema, { prefix: '$form', includeObjects: false, maxDepth: 5 })\n// → [\n//     { path: '$form.firstName', type: 'string', label: { tr: 'Ad', en: 'First name' }, required: true, depth: 0 },\n//     { path: '$form.city',       type: 'string', hasLov: true, depth: 0 },\n//     { path: '$form.branchDetail.address', type: 'string', depth: 1 },\n//   ]\n```\n\nEach entry carries `type`, `format`, `label` (multi-lang), `hasLov`, `hasLookup`,\n`required` (top-level only — `allOf` conditional required is intentionally not\nresolved here; it needs runtime context), and `depth`.\n\n## Vocabularies\n\nThe package includes JSON Schema vocabulary definitions for IDE auto-complete and tooling:\n\n```typescript\n// Import as JSON modules\nimport viewVocab from '@burgan-tech/pseudo-ui/vocabularies/view-vocabulary.json'\nimport viewModelVocab from '@burgan-tech/pseudo-ui/vocabularies/view-model-vocabulary.json'\n```\n\n- **View Vocabulary** — defines all valid component types, properties, and their constraints\n- **ViewModel Vocabulary** — defines all `x-*` extensions (`x-labels`, `x-lov`, `x-conditional`, etc.)\n\n## Cross-Platform\n\nThis package provides the **TypeScript/Vue** implementation. A **Dart/Flutter** package is planned and will render the same JSON schemas and views using Material 3 widgets. Both will share the same vocabulary definitions, ensuring consistent behavior across platforms.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}