{"_id":"@brucesantos/design-space","_rev":"13-042e2d6772fd9cc3fae094511fb33e7f","name":"@brucesantos/design-space","dist-tags":{"latest":"0.9.3"},"versions":{"0.1.0":{"name":"@brucesantos/design-space","version":"0.1.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.1.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"9776d1a45df9fcb6dfae2e8e12046117f48a3505","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.1.0.tgz","fileCount":33,"integrity":"sha512-ElzExxZpHGSRLghUsGEw001lwyQJHG5IlV9fFPvVPC8Uy3ZbJEozXfgaX7VqliMmd0OhCBHtBhqCs4rEbV18WA==","signatures":[{"sig":"MEYCIQCC8VEYwGlPArFszMrgNKxA46pjFw5KQ75jHXFXMsfj4gIhAIm38AVHyFFF118uRS/d+KKxdlcGTQsFx1jqB8m6DXd+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":321566},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"7422348c42c054436c4fe11a8457002c4cb02c3f","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"brucesantos","email":"bruce.santos@gmail.com"},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.1.0_1785419244086_0.6051358722182132","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@brucesantos/design-space","version":"0.1.1","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.1.1","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"03bbb1b24448a1d6c65bd6809795b22e9cdf4277","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.1.1.tgz","fileCount":33,"integrity":"sha512-H3kDEKCHLM9GM4joLyOR64nTaRhu6ZJ6IPBGzu45dicetKD2i/iR2XkCKY2ugJYf7TbFsca1HYuCxfs3G3pboQ==","signatures":[{"sig":"MEYCIQDVRpbNWkv0dBtD4yxrpghIS4lIoVvRsCMihDXwW07W+AIhAI2b1dDaCyexw3Z7RDmZB3cXm3y4dTXH4WmsSzD4+mrF","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":326907},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"e668fed6a91387595e15159473023e040d3f6e16","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"brucesantos","email":"bruce.santos@gmail.com"},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.4","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.21.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.1.1_1785425671041_0.639893213997103","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@brucesantos/design-space","version":"0.2.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.2.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"a71bac739cbd206ebc454ed43eec65b31ad7d84a","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.2.0.tgz","fileCount":33,"integrity":"sha512-mvrARFyMEikbFEhbSIGm+Igi9YNIwqo87iPk0Y8Or7mz+MLeQN9l2W4kUMIC2105TiTetXS5dlvcni0LRz7tgw==","signatures":[{"sig":"MEYCIQCaw2o8pAC9y1S5DdxjIdD9YRB3CtaDSksSP4m4EnU80wIhAILRy9HtWPxvaaSDrM8ghYbkjH6dgFScGjCophlDiVH9","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":355663},"main":"./dist/index.js","type":"module","_from":"file:brucesantos-design-space-0.2.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"brucesantos","email":"bruce.santos@gmail.com"},"_resolved":"/tmp/06a24e164d5e313f4e868c1287975dfe/brucesantos-design-space-0.2.0.tgz","_integrity":"sha512-mvrARFyMEikbFEhbSIGm+Igi9YNIwqo87iPk0Y8Or7mz+MLeQN9l2W4kUMIC2105TiTetXS5dlvcni0LRz7tgw==","repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"10.9.8","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.2.0_1785869861509_0.7083391851914707","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@brucesantos/design-space","version":"0.3.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.3.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"040ce3f60c4826228ffc5d15b93b312830a3c3ea","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.3.0.tgz","fileCount":33,"integrity":"sha512-J6BCiALmPMyOjO8vfzxBzZUUGRThM59GG1EWZMLId5vcykpQxgc3+FRJhrdKdx76ctUaHxxdmBvyMW/RHvWxSA==","signatures":[{"sig":"MEUCIQDw1LyorHHNR1z2QRXVwcPYXuvzD7k2Bljj9w3Pc+xJmgIgO9bWvBWjgpw9GWMdThKo4iY6zzZVIHTDU5nrBBPGubM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":417783},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"e29944f69db1977b2da586bfcca360f7f6b0d893","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"brucesantos","email":"bruce.santos@gmail.com"},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"11.17.0","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"26.5.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.3.0_1786564836566_0.30987195446393456","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@brucesantos/design-space","version":"0.4.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.4.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"44cc2f138fc847f7547f304b33bd7eecbc71995b","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.4.0.tgz","fileCount":33,"integrity":"sha512-A7gI2ARA4RkzHJt+Jg0J/H6Bl51G3gYEeD3IMIe2rBwj921Y/zA7IjxDz2k3o+9bZownlw7p9bc2EYJWc+UZzQ==","signatures":[{"sig":"MEYCIQCpsXDdIqqCEphN2eSgvtznBOu8t5v1CzRniUhX7uFaqwIhAIJwzZyi7FiNMaS+TJtpr0oAz3qbkctiqXIOMVhtYb9h","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":455044},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"aaeff26630e43bda1f05806f5ccd7540b9f60f76","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.4.0_1786570062934_0.6190321899948326","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@brucesantos/design-space","version":"0.5.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.5.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"cb995bb25a42099850af5b92f7e6651f7f00451f","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.5.0.tgz","fileCount":33,"integrity":"sha512-lCCwdJXlh0ZeYUpbGU+AarHx29IXYWFUFhaJRPWPDxPtb6T0P/q9knqm30yQ2WRPCNXdSqbR22vJRUGHB/fKSg==","signatures":[{"sig":"MEYCIQDEPBSLrQddu2i2sVoLOJ12oM9ChoRtGQJa5DnDPhIlkgIhANlRtXNARkGkbg32jC7ILMlRn2Qs7KaDZ/tTKRy9+aRi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":472369},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"8f565406df721ab59b38398bb1eb82520b073a12","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.5.0_1786573288427_0.8015845684170007","host":"s3://npm-registry-packages-npm-production"}},"0.5.1":{"name":"@brucesantos/design-space","version":"0.5.1","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.5.1","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"6050b00b3a45c52d91bcd932e94214e02bf422ad","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.5.1.tgz","fileCount":33,"integrity":"sha512-zeHTeHPA91LDbENFWRCCeWVW36fbTlQjxi+acZQyWWwg47NGBiYHIIj1Wmn2ruiDGIrqTIMT84RzJSGRBr7Whw==","signatures":[{"sig":"MEUCIHDxP2XMEbSEg91WSZAWDHAhG847PRtHdjaZeaUdWyHLAiEA+bMhnHOhijsuwwLo/MgKLOrqKhXbF/XRbnUpogMgbGQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.5.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":475621},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"ee8cfcbf54458188111289f5ac06bd56486e4cdb","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.5.1_1786573952430_0.9348048837177252","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@brucesantos/design-space","version":"0.6.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","a11y"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.6.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"52b067e55810c1df86fade46e388fda2fd4ca5e8","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.6.0.tgz","fileCount":34,"integrity":"sha512-9qGh3+ixmP+QU4XoEmBBMU5ATKdbJXCOQoZA/EKeVeJMB619+uU4aVbBk0X6SbEIw+pIicDWhNVdMCphL1nihA==","signatures":[{"sig":"MEUCIQCQKiBnMjQUSLL7MckdYhdek8z2+DpM1Ws9CS8UOpkb0QIgCQac6o7v4WpboBv+O+Ipk8IMgcOA305joRiWk1NZvoc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":515355},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"03dea28ff13ffb42995e9da958f6cb9c0d5e32d4","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.0.2","description":"Motor neutro do Bananas Design Space: registry de cenários, shell, deep links, controles de persona/viewport/rede, inspetor de regras e ferramentas de acessibilidade. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.6.0_1786636824924_0.5676685251854376","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@brucesantos/design-space","version":"0.8.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.8.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"a09840993f1d78493329f9cf166a3c04dd8c3908","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.8.0.tgz","fileCount":37,"integrity":"sha512-FAq3uH8pM5LZ0ypNZY0AjXwiUW6gp3qjxKaedW+a3RxAGqO1Z7kaIEn7eEJiRayHfX1Zi6I1yguRdzRAYu/60Q==","signatures":[{"sig":"MEQCIFWbB8knc0PefCXQ/6iKnv0GuuQLgmbjBvggRMAQ20ZFAiBQu/div16RdAjf/D+hyqfcqqSr039MXlIrHMXOZfkVWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIGWyAV9N+8sBkh2RrK7gobczdRqsCjSd6YqLcWunW+fbAiAETXcunOkxFc8cOPRpDgnDrLtTaVhiD0t79rmA7TczDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":464544},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"69e4391deea2b3df4e12e7766a19a86f17294e0c","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.8.0_1790639365250_0.5686445426235345","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@brucesantos/design-space","version":"0.9.0","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.9.0","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"6c777b91f11fa2971d5b93227b54db427e2365c1","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.9.0.tgz","fileCount":37,"integrity":"sha512-PTSHKo4dgDc4Za5lC3MAPkuqj7RWoOZ8q0tttk/ucuHKek0Su2Y8h11fK6/6ieFj3S8LyxSXEZluBscZI+J+Xg==","signatures":[{"sig":"MEUCIHPHX+yo/GH3oTNIKS5qvgQPJ4/o0DYm9iInxTpbS+G+AiEAsfZ/p5Rl5E/7V73wYIUwF/z9UwA0d3SAffo93heLG8U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGdX68dUu2uelnLCZQIquuJvJx4+PXCFDq2cwxxWozMSAiEAqXjjvRSEHmzON1lwhYUYdwH0Ew+VRQx8HWqJxzirwNE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":559334},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"0249a864eb0420f868449352171edf6fcd6ed24d","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.9.0_1790693204385_0.8278395699386296","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@brucesantos/design-space","version":"0.9.1","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.9.1","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"0ae6a696321cefb7d2633cf040d96132bb09a932","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.9.1.tgz","fileCount":37,"integrity":"sha512-XZ7S466yr1WDXt4Pq1KgueHmq5yVjOAXYvrGUvFHK9n0YymsczKUarvNW+fZgu6SJQBeGjF1+Oad08b3Y8ZhZQ==","signatures":[{"sig":"MEQCIEwh3jYDUXvz+YhsAqauY1zpNnFHMCzxMpTtmLDCadh4AiAgcQrhJJa0Jqth3MZC10QWc8ZyYlLNayOo+B+QkLQDQQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDg9bUyKR0e8Iistk0/6F9/GgCPGWy35bPHf22RdafyQgIhAPzsU0mycSg8SDOKuRQYjhZHbujFag15W29h8FlBdwH+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":590548},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"4b86f8bdc205145e6a2c6930bde87925bd0218ac","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.9.1_1790696444028_0.251512289552285","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@brucesantos/design-space","version":"0.9.2","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","_id":"@brucesantos/design-space@0.9.2","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"homepage":"https://github.com/bananas-global/design-space#readme","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"0bdb1c778e1eb3c46f1a641bb11dca0e51ed5416","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.9.2.tgz","fileCount":37,"integrity":"sha512-uLg1r25HSpZYH1mCVmmcDv2yVxpDdPi7IraYwjg3tOjMG1Q3LpwHK/JCwaHrCRaOSM6O0hirIsZG7KtR1ddC0A==","signatures":[{"sig":"MEUCIQDkTpQat3deQEl3ycJHCG2AnXSBhvSDpJ758FQNPxGoUQIgUeSMiczjJJmt7lSmdl42h11Rv34jZaq9rz/MKjKnURk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCioP82lGEzyHKL9S/BQQ69VBF7nF8EgCGNJEYdRi32owIgLwR+6SNrVgNaik/LCxQUFOHCDQYWZJVUDmlCxY+DoG8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":584335},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"7958407b0f10aadd03d85f5b661eea414d9fb59e","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45040704-467c-463b-9ec1-15cae021052d"}},"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","directories":{},"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"tmp":"tmp/design-space_0.9.2_1790697566577_0.7655813054433716","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"_id":"@brucesantos/design-space@0.9.3","bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"dist":{"shasum":"e42c5ac799b47152fb16995136985f2e462a2656","tarball":"https://registry.npmjs.org/@brucesantos/design-space/-/design-space-0.9.3.tgz","fileCount":37,"integrity":"sha512-cpmwJHIVlKWRSsa8L0x083CSaxRFVmR5XsoL/T68NuUI0yyBiIJqJW42lfC7Um/vxVe0V3q2RJc0rr7ypCUObA==","signatures":[{"sig":"MEQCIBvbRFYx/5rmGvaVcobhA4ZcyKkOJ7n95WaGI7zdeKYeAiBzHyvrR6R0NmdA4u/jKdGejUUpDbU2I9TA5CnpMbmh6Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCcxPX+Q1I7yK7bmYHPrb3FgDjxGBBC/XdXUbtrKoPU+wIgN6hy1srig3O2UoAlHsx4w5AiDi/2NbELnzUhmJuKZH4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@brucesantos%2fdesign-space@0.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":589344},"main":"./dist/index.js","name":"@brucesantos/design-space","type":"module","types":"./dist/index.d.ts","author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./testing":{"types":"./dist/testing/index.d.ts","default":"./dist/testing.js"},"./styles.css":"./dist/design-space.css"},"gitHead":"517f85bd023271a27da587d60b45a9ba48791871","license":"MIT","scripts":{"dev":"vite build --watch","test":"vitest run","build":"vite build","typecheck":"tsc --noEmit"},"version":"0.9.3","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"45040704-467c-463b-9ec1-15cae021052d"}},"homepage":"https://github.com/bananas-global/design-space#readme","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"_npmVersion":"12.1.0","description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","directories":{},"maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"sideEffects":["**/*.css"],"_nodeVersion":"22.23.2","_hasShrinkwrap":false,"devDependencies":{"vite":"^7.0.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","typescript":"^5.8.3","@types/node":"^26.1.2","@types/react":"^19.1.8","vite-plugin-dts":"^4.5.4","@types/react-dom":"^19.1.6","@vitejs/plugin-react":"^5.0.0"},"peerDependencies":{"react":">=18","react-dom":">=18"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/design-space_0.9.3_1790710892478_0.6903020206464934"}}},"time":{"created":"2026-07-30T13:47:22.695Z","modified":"2026-09-29T19:41:33.601Z","0.1.0":"2026-07-30T13:47:24.260Z","0.1.1":"2026-07-30T15:34:31.172Z","0.2.0":"2026-08-04T18:57:41.652Z","0.3.0":"2026-08-12T20:00:36.743Z","0.4.0":"2026-08-12T21:27:43.167Z","0.5.0":"2026-08-12T22:21:28.582Z","0.5.1":"2026-08-12T22:32:32.585Z","0.6.0":"2026-08-13T16:00:25.097Z","0.8.0":"2026-09-28T23:49:25.353Z","0.9.0":"2026-09-29T14:46:44.494Z","0.9.1":"2026-09-29T15:40:44.147Z","0.9.2":"2026-09-29T15:59:26.685Z","0.9.3":"2026-09-29T19:41:32.616Z"},"bugs":{"url":"https://github.com/bananas-global/design-space/issues"},"author":{"url":"https://github.com/brucesantos","name":"Bruno Santos"},"license":"MIT","homepage":"https://github.com/bananas-global/design-space#readme","keywords":["design-space","executable-specification","scenarios","design-engineering","react","component-catalog"],"repository":{"url":"git+https://github.com/bananas-global/design-space.git","type":"git","directory":"packages/core"},"description":"Motor neutro do Bananas Design Space: telas como rotas com variações, catálogo de componentes, chrome em preto e branco com a UI do produto num iframe, deep links e controles de persona/viewport/rede. Não contém UI de cliente.","maintainers":[{"name":"brucesantos","email":"bruce.santos@gmail.com"}],"readme":"# @brucesantos/design-space\n\nMotor neutro do Bananas Design Space. Fornece o ambiente de revisão — telas e\ncomponentes à esquerda, variações e informações à direita, deep links, controles\nde persona/rede/viewport/zoom e o texto pronto para o PR — sem impor nenhum\ncomponente visual, token ou identidade ao produto.\n\nO chrome é o mesmo para todos os produtos: preto e branco, claro e escuro, sem\ncor de cliente. A UI do produto roda num `<iframe>` da mesma origem e do mesmo\nbundle, com a largura do viewport escolhido: CSS isolado nos dois sentidos, e\nmedia queries respondendo como em produção.\n\n```bash\npnpm add @brucesantos/design-space\n```\n\n## Uso\n\nO produto entrega uma `ProductDefinition` e monta um único componente.\n\n```tsx\nimport { DesignSpace } from \"@brucesantos/design-space\";\nimport \"@brucesantos/design-space/styles.css\";\nimport { productDefinition } from \"./product\";\n\nexport function App() {\n  return <DesignSpace product={productDefinition} />;\n}\n```\n\n## Telas e variações\n\n**Uma tela é uma rota.** As **variações** de uma tela são os cenários cuja\n`route` casa com o `path` dela — pelo mesmo casamento do roteador, então\n`/requests/REQ-2043` é variação de `/requests/:id`, e `/requests/new` fica com a\nrota literal. A ordem das telas é a de `routes`; a das variações, a de\n`scenarios`. Rota sem cenário também é tela, aberta numa variação \"Padrão\".\n\n```ts\nroutes: [\n  { path: \"/requests\", screen: RequestList, name: \"Fila de solicitações\" },\n  {\n    path: \"/requests/:id\",\n    screen: RequestDetail,\n    name: \"Detalhe da solicitação\",\n    description: \"Análise e decisão de uma solicitação.\",\n  },\n],\n```\n\nSem `name`, a tela usa o título do primeiro cenário da rota e, na falta dele, o\n`path`. Não existe módulo nem jornada (decisão 0012).\n\n**Rota com parâmetro** (desde a 0.9.1): `params` dá um valor de exemplo para cada\n`:param` (e para `*`, se houver). O motor usa o exemplo sempre que abre a tela\nsem cenário — na lateral, na variação padrão, no \"Usado em\" de Informações e\nno \"Copiar para o PR\":\n\n```ts\n{ path: \"/orders/:id\", screen: OrderDetail, name: \"Detalhe do pedido\", params: { id: \"1042\" } }\n// abre em /orders/1042, não em /orders/:id\n```\n\nSem `params`, o caminho continua literal, e a validação avisa quando nenhum\ncenário cobre a rota. Exemplo que a rota não tem, ou que monta um caminho de\noutra rota (`/orders/new`), também é aviso.\n\n## Fluxos e controles (0.9)\n\nUma feature raramente é uma tela: é um **fluxo** de algumas telas, e cada tela\ntem **componentes** que variam de forma independente. Desde a 0.9 as duas coisas\nsão declaradas na rota, e nada disso é obrigatório\n([decisão 0013](../../docs/decisions/0013-fluxos-e-controles-por-componente.md)).\n\n```ts\nroutes: [\n  {\n    path: \"/orders\",\n    screen: OrderList,\n    name: \"Lista de pedidos\",\n    group: \"Pedidos\", // o fluxo: agrupa as telas na aba Telas\n    expected: [\"A lista mostra os pedidos do período.\"],\n    components: [\"data.table\"],\n    controls: [\n      {\n        id: \"table\",\n        title: \"Tabela de pedidos · table\",\n        component: \"data.table\", // link para o catálogo no painel\n        note: \"Linhas e ordenação.\",\n        controls: [\n          {\n            id: \"rows\",\n            label: \"Linhas\",\n            options: [\n              { value: \"many\", label: \"Muitas\" },\n              { value: \"one\", label: \"Uma\" },\n              { value: \"none\", label: \"Nenhuma\" },\n            ],\n          },\n        ],\n      },\n      {\n        id: \"overlay\",\n        title: \"Sobreposição\",\n        controls: [\n          {\n            id: \"overlay\",\n            label: \"Aberta\",\n            options: [\n              { value: \"none\", label: \"Nenhuma\" },\n              { value: \"cancel\", label: \"Cancelar pedido\" },\n            ],\n          },\n        ],\n      },\n    ],\n  },\n  { path: \"/orders/:id\", screen: OrderDetail, name: \"Detalhe do pedido\", group: \"Pedidos\" },\n],\n```\n\n- **Aba Telas:** agrupada por `group`, em seções recolhíveis com contagem, como\n  os componentes. Tela sem `group` fica no topo, sem título. A busca casa também\n  o nome do fluxo.\n- **Painel Variações:** uma pilha de **cartões**, sem acordeão nem contagem.\n  Primeiro o cartão **Contexto** (persona, rede, e tema, idioma e fonte de dados\n  quando o produto declara), depois um cartão por `ControlGroup` e, por fim, o\n  cartão **Atalhos** com os cenários da tela (só quando existem). O título do\n  cartão fica numa linha só; com `component`, uma seta ↗ ao lado abre o\n  componente no catálogo, e a `note` do grupo aparece só como dica (`title`) do\n  cabeçalho. **Todo controle é um select**, sem rótulo visível — as opções dizem\n  o que são; o `label` fica para o leitor de tela e o filtro, e a `description`\n  vira dica. Num componente, o cartão tem o nome dele e um select das fixtures.\n  O filtro (`Cmd`/`Ctrl` + `F`) alcança grupos, controles e opções.\n- **Na URL:** cada controle fora do padrão vai como `c.<id>=<value>`. Valor\n  inválido cai no padrão e aparece como aviso no diagnóstico. Os `c.*` chegam ao\n  quadro, e mudar um controle atualiza o quadro por mensagem, sem recarregar.\n- **Na tela:** `context.controls` traz o valor de cada controle, com os padrões\n  aplicados; `context.setControl(id, value)` muda um deles a partir da UI do\n  produto (fechar um modal volta a sobreposição para \"nenhuma\") e atualiza a URL,\n  e `context.setControls({ … })` muda vários numa única atualização. Desde a\n  0.9.1, chamadas seguidas no mesmo handler se acumulam — cada uma parte do\n  endereço mais recente, não do valor da última renderização —, inclusive dentro\n  do quadro.\n  Sem cenário, a tela monta os próprios dados sintéticos a partir dos controles —\n  é o caso normal agora —, e o estado de rede do contexto continua valendo.\n- **Navegando com controles:** `context.navigate(\"/orders\", { controls: { rows:\n  \"one\" } })` abre a tela de destino com esses controles (valor igual ao padrão\n  da tela de destino não entra na URL). Ver [Navegação](#navegação).\n- **Cenário como atalho:** `Scenario.controls` fixa uma combinação. Abrir o\n  cenário aplica esses valores sobre os padrões; mudar um controle depois não\n  troca de cenário, mas o atalho deixa de aparecer destacado quando a combinação\n  deixa de ser a dele.\n\n```ts\n{ id: \"orders.cancel\", title: \"Cancelando um pedido\", route: \"/orders\",\n  fixture: \"orders\", controls: { overlay: \"cancel\" }, expected: [\"O modal pede confirmação.\"] }\n```\n\n```tsx\nfunction OrderList({ context }: ScreenProps) {\n  const rows = buildRows(context.controls.rows); // dado sintético do produto\n  return (\n    <>\n      <Table rows={rows} />\n      {context.controls.overlay === \"cancel\" && (\n        <CancelModal onClose={() => context.setControl(\"overlay\", \"none\")} />\n      )}\n      <button onClick={() => context.setControls({ rows: \"many\", overlay: \"none\" })}>Limpar</button>\n    </>\n  );\n}\n```\n\nInformações mostra rota, fluxo, descrição, os controles com o valor atual, o\ncomportamento esperado (o do cenário ativo, senão `route.expected`) e os\ncomponentes (`route.components` mais os do cenário). **Copiar para o PR**, numa\ntela com fluxo, gera o markdown do fluxo inteiro: para cada tela, nome, rota,\nlink absoluto (com os controles atuais na tela aberta), controles disponíveis,\natalhos, comportamento esperado e a tabela componente → origem.\n\nA validação checa ids de grupo e de controle únicos por tela, `default` entre as\nopções e `Scenario.controls` usando controles e valores da tela do cenário; id de\ncomponente inexistente em `route.components` ou `group.component` é aviso.\n\n## O contrato de cenário\n\nUm cenário combina intenção, persona, permissões, pré-condições, dados, ações,\nregras e resultado esperado. O `title` é o nome da variação na lista.\n\n```ts\nimport type { Scenario } from \"@brucesantos/design-space\";\n\nexport const approveBlocked: Scenario = {\n  id: \"requests.approve-blocked\",\n  title: \"Aprovação bloqueada por falta de documento\",\n  intent: \"Verificar se a regra fica legível na tela.\",\n  route: \"/requests/REQ-2043\",\n  persona: \"approver\",\n  permissions: [\"requests.read\", \"requests.approve\"],\n  fixture: \"request-without-document\",\n  rules: [\"approval-needs-document\"],\n  expected: [\"O motivo do bloqueio aparece junto da ação indisponível.\"],\n  components: [\"actions.primary-button\", \"feedback.notice\"],\n};\n```\n\nO vocabulário do exemplo é genérico de propósito: o domínio é do produto, nunca do\nmotor.\n\n- `id` é qualquer id estável, minúsculo, em kebab-case com pontos opcionais.\n  Precisa ser único; não precisa de prefixo.\n- `persona` é opcional. Cenário sem persona usa a persona padrão do produto\n  (`ProductDefinition.defaultPersona`, desde a 0.9.1) e, sem ela, tem permissões\n  vazias, a menos que declare `permissions`.\n\n### Persona padrão\n\n`defaultPersona: \"<id>\"` na `ProductDefinition` é a persona efetiva de toda tela\ne todo cenário sem persona própria: `context.persona`, `context.permissions` e\n`context.can` refletem ela, também dentro do quadro. O seletor de persona do\npainel deixa de oferecer \"—\" e mostra o padrão selecionado, e `persona=` só vai\npara a URL quando difere do padrão efetivo. Persona do cenário e a escolhida no\npainel continuam vencendo. Id inexistente é erro de validação. Sem\n`defaultPersona`, nada muda.\n- `components` lista os ids de `ComponentPreview` usados na tela. Alimenta\n  \"Componentes usados\", o \"Usado em\" de cada componente e o \"Copiar para o PR\".\n\n## O chrome\n\n| Região | Conteúdo |\n| --- | --- |\n| Barra superior | Nome do produto; viewport (Celular 375, Tablet 768, Desktop 1280, Ajustar), girar, zoom 25–150%, copiar link, revisão limpa, tema, painel e — quando a validação tem algo a dizer — o indicador de diagnóstico. |\n| Esquerda | **Telas** e **Componentes**, com contagem e busca sem acento nem caixa (nome, descrição, fluxo ou grupo, id e `source`). Telas agrupadas por fluxo (`route.group`), componentes por `group`. Redimensionável. |\n| Centro | O quadro do produto no tamanho do viewport, com zoom só de visualização. |\n| Direita | **Variações** (contexto no topo, controles da tela por componente e os cenários como atalhos; ou as fixtures do componente) e **Informações** (rota, fluxo, controles, intenção, pré-condições, ações, comportamento esperado, regras, componentes usados e **Copiar para o PR**). Redimensionável. |\n\nSem Home: a raiz abre a primeira tela na primeira variação ou, sem telas, o\nprimeiro componente. O tema segue o sistema, e a troca é lembrada.\n\n### Copiar para o PR\n\nGera markdown com o nome da tela, um link absoluto por variação (com o link do\ndeployment e o commit quando o produto informa), a tabela componente → origem e\no comportamento esperado de cada variação. Tela com fluxo gera o fluxo inteiro\n(ver [Fluxos e controles](#fluxos-e-controles-09)).\n\n### O quadro\n\nO chrome renderiza `<iframe data-ds-frame>` apontando para o mesmo endereço com\n`ds-frame=1`. Nesse modo, `<DesignSpace>` renderiza **só** o wrapper do produto e\na tela ou o preview. Trocar variação, persona ou rede vai por `postMessage`, sem\nrecarregar; trocar de tela ou de componente troca o endereço do quadro sem criar\nentrada no histórico. Navegação feita pela UI do produto (`context.navigate`,\n`openScenario` ou um link comum) volta para a URL do chrome. Os dois lados só\naceitam mensagem da mesma origem e da janela esperada.\n\n### Navegação\n\n`context.navigate(to, options?)` — e um link comum dentro do quadro — segue duas\nregras, conforme o destino:\n\n- **Sem query e sem `controls`** (`navigate(\"/orders/1042\")`): a query atual\n  segue inteira; numa tela diferente, os `c.*` da anterior ficam para trás.\n- **Com query própria ou com `controls`** (`navigate(\"/orders?c.rows=one\")`,\n  `navigate(\"/orders\", { controls: { rows: \"one\" } })`): o destino manda. Desde a\n  0.9.1, o contexto do motor — tudo que não é `scenario`, `fixture`, `component`\n  nem `c.*`: persona, rede, viewport, tema, idioma, fonte de dados, handoff e os\n  parâmetros do chrome — é preservado, a menos que o destino traga o mesmo\n  parâmetro. Os `c.*` da tela anterior são descartados. A persona que vinha do\n  cenário deixado para trás vira `persona=` explícito (quando difere da persona\n  padrão), para quem está olhando não mudar; a rede e a fixture do cenário ficam\n  com ele. `controls` vira `c.*` do destino, sem os valores que já são o padrão\n  da tela de destino (ou o que o cenário de destino fixa).\n\n`options.replace` substitui a entrada do histórico em vez de criar outra. O\nrecorte de handoff atual é sempre reaplicado.\n\n**Limitação conhecida.** O motor ainda não sabe que parâmetro é da tela do\nproduto: numa navegação sem query, a query da tela anterior segue para a\npróxima; com query própria, ela só sai se o destino trouxer a mesma chave. Até\nexistir um conceito de query da tela, quem guarda estado na URL tira o que não\nvale mais no destino. Ver\n[0014](../../docs/decisions/0014-query-da-tela.md).\n\n## A URL é o estado\n\nTodo controle é serializado na query string, então a mesma URL sempre produz a\nmesma situação. `?scenario=<id>` sozinho já herda persona, fixture e estado de\nrede declarados no cenário.\n\n| Parâmetro | Efeito |\n| --- | --- |\n| `scenario` | Cenário ativo. Define os padrões dos demais. |\n| `component` | Referência ativa no catálogo visual do produto. |\n| `persona` | Troca o papel e as permissões. Omitido quando é o do cenário ou a persona padrão do produto. |\n| `fixture` | Troca a fixture global do cenário ou a fixture local do componente ativo. |\n| `network` | `success`, `loading`, `empty`, `error`, `slow`. |\n| `c.<id>` | Valor de um controle da tela. Omitido quando é o padrão (ou o que o cenário fixa). |\n| `viewport` | `fit`, `mobile`, `tablet`, `desktop`; `custom` para links antigos. |\n| `w` | Largura, quando `viewport=custom`. |\n| `rotate=1` | Troca largura e altura do viewport. |\n| `zoom` | Zoom da visualização, 25–150. Omitido em 100. |\n| `theme`, `locale`, `source` | Variações declaradas pelo produto. |\n| `appearance` | Tema do chrome, `light` ou `dark`. Omitido: última escolha ou o sistema. |\n| `chrome=0` | Revisão limpa: oculta o chrome do ambiente. |\n| `panel=0` | Oculta o painel direito. |\n| `tab=info` | Abre o painel direito em Informações. |\n| `handoff=1` | Ativa um recorte explícito de revisão/handoff. |\n| `allowScenario` | Cenário permitido; pode ser repetido e autoriza também a rota do cenário. |\n| `allowRoute` | Padrão de rota permitido, como `/requests/:id`; pode ser repetido. |\n| `allowComponent` | Componente permitido; pode ser repetido. |\n\n### Query da tela\n\nQualquer outro parâmetro é da tela do produto: aba, passo de um fluxo, filtro,\npágina. O motor não o lê, só o carrega. Desde a 0.9.3, mudar persona, rede,\nviewport, zoom, tema, o painel ou um controle da tela — pelo painel ou por\n`context.setControl`/`setControls` de dentro do quadro — preserva essa query.\nAbrir outra tela, cenário ou componente pela navegação do chrome a descarta, e\n\"Copiar link\" e \"Copiar para o PR\" levam a query da tela aberta.\n\nA tela lê essa query em `window.location.search`. É garantido que a URL do\nquadro já está em dia quando a tela renderiza: o motor troca o endereço do\nquadro com `replaceState` antes de atualizar o estado.\n\n## Handoff focado por URL\n\nO handoff é uma allowlist transportada junto dos demais controles. Ela filtra\ntelas, variações, busca e componentes. A raiz abre o primeiro item permitido;\numa tentativa de abrir cenário, rota ou componente fora da lista mostra um\nbloqueio claro no quadro, sem montar a tela solicitada. Links internos da UI do\nproduto carregam o recorte.\n\n```ts\nimport {\n  scenarioUrl,\n  type HandoffScope,\n} from \"@brucesantos/design-space\";\n\nconst handoff = {\n  scenarios: [\"requests.approve-blocked\", \"requests.approve-allowed\"],\n  routes: [\"/help/:topic\"],\n  components: [\"actions.primary-button\"],\n} satisfies HandoffScope;\n\nconst url = scenarioUrl(approveBlocked, {\n  origin: \"https://review.example.test\",\n  overrides: { handoff },\n});\n```\n\nO endereço resultante usa parâmetros repetíveis e legíveis:\n\n```text\n?scenario=requests.approve-blocked&persona=approver&fixture=request-without-document&handoff=1&allowScenario=requests.approve-allowed&allowScenario=requests.approve-blocked&allowRoute=%2Fhelp%2F%3Atopic&allowComponent=actions.primary-button\n```\n\nAs listas são uma união: cenários tornam suas próprias rotas acessíveis, rotas\nexplícitas cobrem páginas sem cenário e componentes precisam ser listados\nseparadamente. `applyHandoffScope()` e `parseHandoffScope()` constroem ou leem o\nmesmo contrato em URLs próprias.\n\nEste recorte é um bloqueio de foco/UX, **não segurança**. O bundle e o catálogo\ncontinuam no navegador. Preview público que precisa ocultar de fato o restante do\nproduto exige build separado para o recorte ou autenticação/autorização no\nproduto que publica o preview.\n\nO indicador de diagnóstico continua deliberadamente geral: avalia o catálogo\ninteiro, inclusive fora do handoff.\n\n## API\n\n### Shell\n\n- `DesignSpace` — o ambiente completo: chrome no documento de cima, UI do\n  produto no quadro.\n- `StageEmpty` — estado vazio neutro, para `notFound` e casos fora do padrão.\n- `FRAME_PARAM`, `FRAME_ATTRIBUTE` — o parâmetro do modo quadro e o atributo do\n  `<iframe>`.\n\n### Rótulos do chrome\n\nO chrome vem em português por padrão e é traduzível pelo produto, por grupo. O que\nnão for declarado fica no padrão.\n\n```ts\ntheme: {\n  labels: {\n    network: { success: \"Success\", error: \"Error\" },\n    topbar: { copyLink: \"Copy link\" },\n    info: { copyForPr: \"Copy for PR\" },\n  },\n}\n```\n\n- `DEFAULT_LABELS` — o dicionário completo, em português.\n- `EN_US_LABELS` — o dicionário completo em inglês dos Estados Unidos.\n- `resolveLabels(override)` — mescla por grupo. Útil fora de React.\n- `useLabels()` — os rótulos resolvidos, dentro do chrome.\n- `Labels`, `LabelsOverride` — os tipos.\n\nRótulo de **produto** continua vindo do produto: nome de tela, título de cenário,\nnome de persona, rótulo de fixture.\n\nPara usar o chrome integralmente em en-US:\n\n```ts\nimport { EN_US_LABELS } from \"@brucesantos/design-space\";\n\nconst product = {\n  // ...\n  theme: {\n    locales: [\"en-US\"],\n    labels: EN_US_LABELS,\n  },\n};\n```\n\n### Aparência do chrome\n\nPreto e branco, igual em todo produto. O botão de tema alterna claro e escuro sem\ntocar na UI do produto; a escolha vai para `?appearance=` e fica lembrada no\nnavegador. Sem escolha, vale o `prefers-color-scheme` do sistema. Não existe\ntema, cor ou logo por produto.\n\n### Registry e validação\n\n- `createRegistry(product)` — índice consultável.\n- `screens`, `screen(id)`, `screenForPath(path)`, `screenOf(scenario)` — telas\n  (`ScreenNode`) e suas variações. `ScreenNode.href` é o caminho da tela sem\n  cenário, com os exemplos de `route.params`.\n- `defaultPersona` — a persona padrão do produto, quando registrada; entra em\n  `permissionsOf(scenario)` para cenário sem persona.\n- `screensFor({ handoff })`, `activeScenarios()`, `search()`,\n  `searchScreens()`, `searchComponents()`, `componentsFor(handoff)` — aplicam o\n  recorte; a busca não diferencia acento nem caixa (`normalizeSearch`).\n- `componentsOfScreen(screen, scenario?)`, `usagesOf(componentId)` — componentes\n  de uma tela e telas de um componente, a partir de `route.components` e\n  `Scenario.components`.\n- `flows(options)`, `flowOf(screen)` — telas agrupadas por fluxo (`FlowNode`).\n  `controlsOf(screen)` e `resolveControls(screen, { scenario, requested })` —\n  controles da tela e seus valores (padrão → cenário → URL), com os pedidos\n  inválidos em `invalid` (`ControlResolution`).\n- `validateProduct(product)` / `validateScenario(scenario)` — validação em runtime\n  do contrato. Pega fixture, persona, regra ou rota inexistente, rota duplicada,\n  id duplicado e componente citado sem registro — o que o TypeScript não\n  alcança. `routes` vazio só é erro quando há cenários, então um produto que é\n  só catálogo de componentes é válido.\n\n### Catálogo de componentes\n\nO motor fornece navegação, busca e deep link; cada preview continua sendo UI do\nproduto. Um produto pode ser só catálogo: com `scenarios`, `fixtures` e `routes`\nvazios, a aba Telas some e a raiz abre o primeiro componente. As **variações** de\num componente são as `fixtures` dele; `source` diz de onde ele vem no sistema\nreal.\n\n```tsx\ntype ButtonData = {\n  label: string;\n  disabled?: boolean;\n};\n\nfunction PrimaryButtonPreview({\n  fixture,\n  data,\n  viewport,\n  themeMode,\n  locale,\n}: ComponentPreviewProps<ButtonData>) {\n  return (\n    <button disabled={data?.disabled} data-viewport={viewport.id}>\n      {data?.label ?? fixture?.label ?? \"Botão\"}\n    </button>\n  );\n}\n\nconst product: ProductDefinition = {\n  // ...\n  components: [\n    {\n      id: \"actions.primary-button\",\n      name: \"Botão primário\",\n      group: \"Ações\",\n      description: \"Ação principal da página\",\n      source: \"components/button.ex → button/1\",\n      preview: PrimaryButtonPreview,\n      defaultFixture: \"default\",\n      fixtures: [\n        {\n          id: \"default\",\n          label: \"Padrão\",\n          description: \"Ação pronta para uso.\",\n          data: { label: \"Continuar\" },\n        },\n        {\n          id: \"disabled\",\n          label: \"Desabilitado\",\n          data: () => ({ label: \"Continuar\", disabled: true }),\n        },\n        {\n          id: \"long-content\",\n          label: \"Conteúdo longo\",\n          data: { label: \"Continuar para a próxima etapa do processo\" },\n        },\n      ],\n    },\n  ],\n};\n```\n\nAbrir o exemplo produz\n`?component=actions.primary-button&fixture=default`; trocar os dados para o\nestado desabilitado produz\n`?component=actions.primary-button&fixture=disabled`. Se a URL pedir uma fixture\ninexistente, o preview usa `defaultFixture` (ou a primeira fixture) e o painel\nnomeia o fallback; a URL inválida não é descartada silenciosamente.\n\n`ComponentPreview`, `ComponentPreviewFixture` e `ComponentPreviewProps` são os\ntipos públicos. Um preview 0.3.0 sem props continua compatível:\n\n```tsx\nfunction StatusPreview() {\n  return <StatusBadge status=\"approved\" />;\n}\n```\n\n### Três tipos de estado\n\n- **Fixture de cenário:** vive em `ProductDefinition.fixtures` e materializa uma\n  situação completa, com persona, permissões, regras e intenção.\n- **Fixture de componente:** vive em `ComponentPreview.fixtures`, tem escopo\n  somente naquele componente e representa dados como padrão, preenchido, vazio,\n  carregando, erro, desabilitado ou conteúdo longo. Não recebe nem simula\n  `ScenarioContext`.\n- **Estado interativo local:** modal aberto, checkbox marcado, hover ou foco\n  continuam no próprio preview. Não precisam de uma segunda abstração de\n  variants.\n\n### Deploy e deep links\n\nO motor não conhece provedor de hospedagem, e um Design Space que roda só local é\ncaso suportado: sem contexto, o ambiente é `development` e o cabeçalho da revisão\nomite branch e commit.\n\n- `getDeployContext(overrides)` — monta branch, commit, ambiente e origem absoluta\n  a partir do que o produto informou em `ProductDefinition.deploy`. Não lê\n  ambiente: o motor é biblioteca compilada e não alcança o build de quem o\n  consome.\n- `scenarioUrl(scenario, options)` — URL absoluta reproduzível.\n- `componentUrl(component, options)` — URL absoluta do componente com sua fixture.\n- `commitUrl(scenario, { template })` — URL imutável do cenário num commit. O\n  template é do produto, com `{commit}` ou `{shortCommit}`.\n\n### Dados\n\n- `fixtureAdapter` — o padrão. Materializa os cinco estados de rede.\n- `createHttpAdapter(options)` — adapter REST/GraphQL com fallback para fixture.\n- `useScenarioData(...)` — resolução do cenário ativo pelo adapter selecionado.\n\n### Testes\n\n`@brucesantos/design-space/testing` — entrypoint separado, fora do bundle do\npreview.\n\n- `pathFor(scenario, overrides)` — caminho relativo para `page.goto`, deixando o\n  `baseURL` do Playwright decidir entre preview e dev server.\n- `testOrigin(fallback)` — lê `PREVIEW_URL` quando existe um ambiente publicado\n  para testar; sem ela, o Playwright roda contra o dev server local.\n- `assertValidProduct(product)` — falha o teste quando o contrato tem erro.\n- `FRAME_SELECTOR` — o seletor do quadro. A UI do produto está num iframe:\n\n```ts\nawait page.goto(pathFor(scenario));\nconst app = page.frameLocator(FRAME_SELECTOR);\nawait expect(app.getByRole(\"heading\", { name: \"Fila\" })).toBeVisible();\nawait expect(page).toHaveURL(/scenario=/); // o chrome fica em `page`\n```\n\n## Atalhos\n\n| Atalho | Efeito |\n| --- | --- |\n| `Command/Ctrl` + `K` | Foco na busca da lateral |\n| `Shift` + `C` | Revisão limpa: esconde e mostra o chrome |\n| `Command/Ctrl` + `F` | Foco no filtro do painel direito |\n\nOs três funcionam também com o foco dentro do quadro; `Shift` + `C`, fora de\ncampos de texto.\n\n## Créditos\n\nOs ícones do chrome seguem o traço do [Lucide](https://lucide.dev/),\ndisponibilizado sob licença MIT. Obrigado às pessoas mantenedoras e\ncontribuidoras do projeto. Os SVGs são incorporados ao motor, portanto não existe\ndependência de runtime do Lucide.\n\n## Fronteira\n\nO motor **não** contém e não deve conter: componente visual, token, tipografia,\ncor, ícone, persona de domínio, fixture, regra de negócio ou conteúdo de cliente.\nIsso é exclusivo de cada produto — e é o que permite que dois produtos sobre o\nmesmo motor continuem parecendo produtos distintos. O chrome em preto e branco é\nferramenta, não identidade: a identidade do cliente fica inteira dentro do\nquadro.\n\nTrês coisas que também não pertencem ao motor, cada uma travada por teste:\nprovedor de hospedagem, texto visível fixo em componente do chrome e nome de\ncliente em exemplo.\n\n## Licença\n\nMIT.\n","readmeFilename":"README.md"}