{"_id":"@stapel/chat-react","_rev":"40-142950a7ce38cce115bc98d481e08da6","name":"@stapel/chat-react","dist-tags":{"latest":"0.23.0"},"versions":{"0.1.0":{"name":"@stapel/chat-react","version":"0.1.0","license":"MIT","_id":"@stapel/chat-react@0.1.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"homepage":"https://github.com/usestapel/stapel-react#readme","bugs":{"url":"https://github.com/usestapel/stapel-react/issues"},"dist":{"shasum":"7ad0d2673151b7d0b88a5aa102d72fab773141c2","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.1.0.tgz","fileCount":195,"integrity":"sha512-2y+DT9K9/HzRVDrZZxxAPs0i2y/lKdaXKmEokn3AgtryVQl6FOZb0sgW5r1pIwgDl0402DOosXJsOJjadMK9bA==","signatures":[{"sig":"MEUCIQCd0O6FdgPCPENU9IaB61Bn6bOfQ/u67VLR5Z+d6NBqSAIgDEtunZCFveNKvvrramjj2tPau+OJOc38/DvtAOFnqlk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":547687},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"gitHead":"bb9379f5de356cfd3e3a588561e9b8e632bf5640","scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"},"repository":{"url":"git+https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam)","path":"dist/index.js","limit":"9 KB"},{"name":"default — the antd chat skin must stay out of the main bundle","path":"dist/default/index.js","limit":"10 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"4 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry","path":"dist/i18n/es.js","limit":"3.5 KB"}],"_npmVersion":"10.9.2","description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"workspace:^","@types/react":"^19.1.0","@stapel/tokens":"workspace:^","@stapel/showcase":"workspace:^","@types/react-dom":"^19.1.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.14.0 <1.0.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.1.0_1787404024779_0.37572900386950225","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@stapel/chat-react","version":"0.2.0","license":"MIT","_id":"@stapel/chat-react@0.2.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"121f9dd7a135db5a674cd123648b9964243a3e16","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.2.0.tgz","fileCount":196,"integrity":"sha512-3T/weQRlQFFku171riC87rSGVjh1GBKPFkduyLfcboC8rd5j6fAx5ccHStatIV4rVHDPHIeul6wrhPZNjoaDWA==","signatures":[{"sig":"MEUCIQD3g2yVrXFxET3lqRYuMC8hHa5VD7QjOktXc+VofAoCWQIgW3DbNDGLHgQhee46BgSo8oSx+TLNnbSTy+jRStFs0fY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":551633},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam)","path":"dist/index.js","limit":"9 KB"},{"name":"default — the antd chat skin must stay out of the main bundle","path":"dist/default/index.js","limit":"10 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"4 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry","path":"dist/i18n/es.js","limit":"3.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.15.0","@types/react":"^19.1.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.14.0 <1.0.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.2.0_1787441275355_0.9775186811362298","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@stapel/chat-react","version":"0.3.0","license":"MIT","_id":"@stapel/chat-react@0.3.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"46afb2faab81569e5a5a9d626afcdcaf22673b2c","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.3.0.tgz","fileCount":201,"integrity":"sha512-fakI55jYqG0Vdrvzp1nk0vSVR+pxBt9sAMc3TMoYsSW8KvG6DB5m0FWIoZppsO7tOmhz1OLrt8pxoIuTR9Xscw==","signatures":[{"sig":"MEUCIE7QLpVT1+n+8QFFl/vELN06KokUYak2dTS44Wyc2F4AAiEA9t2xEhX+Vl6049YAGs1g+QkhACzl5HZc7YmLGbO2KUk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":570336},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam)","path":"dist/index.js","limit":"9 KB"},{"name":"default — the antd chat skin must stay out of the main bundle","path":"dist/default/index.js","limit":"10 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"4 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry","path":"dist/i18n/es.js","limit":"3.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.16.0","@types/react":"^19.1.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.15.0 <1.0.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.3.0_1787472217498_0.3609781415093114","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@stapel/chat-react","version":"0.3.1","license":"MIT","_id":"@stapel/chat-react@0.3.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"18479a97a623ca2632123f35dec34be93fd3e7cc","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.3.1.tgz","fileCount":201,"integrity":"sha512-WWibk3ZjzO3baCLRJktd2B7+4YjC2wJt58R3syGQEgJD0BqfN8DFtWv2Rg1J6x5XIbkCdHqd2XJnf7fIicpwjA==","signatures":[{"sig":"MEUCIQDvL7L5GElnYwNLqMf9rVH1NATExqG9yc1zsFIM/0iB5AIgKNPrny4/TekpVXMhXw4gAGKo+OeCbUu6sUMNkfpWcNg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":570772},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam)","path":"dist/index.js","limit":"9 KB"},{"name":"default — the antd chat skin must stay out of the main bundle","path":"dist/default/index.js","limit":"10 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"4 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry","path":"dist/i18n/es.js","limit":"3.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.17.0","@types/react":"^19.1.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.16.0 <1.0.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.3.1_1787506499823_0.2549705659061223","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@stapel/chat-react","version":"0.4.0","license":"MIT","_id":"@stapel/chat-react@0.4.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"8fc230e223d41dcce9bc481149069755100c0c47","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.4.0.tgz","fileCount":216,"integrity":"sha512-A+2FUThmWLheT9bVXJMIrM1uChHW5pleQpVIUqZ4uUbn/qTYL1bcDJJ/AinX1m2F6mnL7DEC+RnS889JKEiR2Q==","signatures":[{"sig":"MEYCIQC7DEkrtQGSl9NFIxgNrxvwybxly684/+quf+zvnmaTZQIhAIAdF8f2BYBI0YNGcS2s2xF/HPIvwULv5i9Mq2Wf8fN6","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":807238},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam)","path":"dist/index.js","limit":"9 KB"},{"name":"default — the antd chat skin must stay out of the main bundle","path":"dist/default/index.js","limit":"10 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them)","path":"dist/i18n/ru.js","limit":"4.5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry","path":"dist/i18n/es.js","limit":"3.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.18.1","@types/react":"^19.1.0","@stapel/tokens":"^0.5.1","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.7.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.16.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.4.0_1787777937625_0.9818507383971546","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@stapel/chat-react","version":"0.5.0","license":"MIT","_id":"@stapel/chat-react@0.5.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"257c95bb8c18987b54059af09fb1c8343e18fe5c","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.5.0.tgz","fileCount":241,"integrity":"sha512-Co4oPrZn6W6+loO41qA4iPel2+Job5/+qMbDc1LcmWto5bNZ0JXHrIBpF2VlpZTCj5tjTMOd4lNynA8HlG4hzw==","signatures":[{"sig":"MEUCIBdYD3bKYj8JjRuaJbT7UAdL6gAnHsYNZaj+Xjt/YjK7AiEArthNFK2ssxt6shSKxCVjakIPGlyUXM5nkAMCbTqVkK0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDjJ8hyApYYzByrBmVpO847NAjMkpIENlSsvuEBwkC/5AIhALMeBSTWkwoVZzGT9AuzZaCg1sYPfO7bkQaMiv+FQzgw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":953942},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B)","path":"dist/index.js","limit":"9.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design","path":"dist/default/index.js","limit":"13 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word","path":"dist/i18n/ru.js","limit":"4.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added","path":"dist/i18n/es.js","limit":"3.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.19.0","@types/react":"^19.1.0","@stapel/tokens":"^0.5.1","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.7.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.19.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.5.0_1787889202984_0.042260681450358106","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@stapel/chat-react","version":"0.6.0","license":"MIT","_id":"@stapel/chat-react@0.6.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"090d5e2f8bf126004a37711a87490c8886cf0407","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.6.0.tgz","fileCount":261,"integrity":"sha512-EIqG0QR8hCXo2ATBjDpPEcHWAB56P43ZiJXJNSxN7uhXiDMDB8xVxzL7JFDDUUdBccQInfOnGY65EIiTsMqbHQ==","signatures":[{"sig":"MEUCIQDVwrKOo2iz/SUVX+QNKXsg9pK4YETw/5qLwdtlVRU+QQIgP0R0zcHR8SWSlhx+vBs8kngBs6x7v/BFFBMiQ8dM5d8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCqtp7i39jBlGMfs8P2xBy/fSBXn0dvGsByNUd8aj7hVwIgBiITuXSxwGGAyf3r5tUVLrwNIY9sLbMTjcqXaJNVUF8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1040172},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate.","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.20.0","@types/react":"^19.1.0","@stapel/tokens":"^0.6.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.8.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.6.0_1788044844938_0.9627871658323566","host":"s3://npm-registry-packages-npm-production"}},"0.6.1":{"name":"@stapel/chat-react","version":"0.6.1","license":"MIT","_id":"@stapel/chat-react@0.6.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"64e5b5e5815a88fbc4ae91c8989569d9c33923e8","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.6.1.tgz","fileCount":261,"integrity":"sha512-3pk4TJxyuyhBBEmhzH5lnyaztgRrr2ADkylHut5lqwlzaQ3PsgKyOU3x3mEx6PlKRiWEOVwQhx2Kj5+zACUvuQ==","signatures":[{"sig":"MEUCIGVqewPNLgUl5gb9w8iImaoBs22cJaA8AmwREyt3jouKAiEAkfctHA7JH0MlaaQCf+HKpkfpzxl5H8TY5gLTrcIsJF8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFFoeRZOQk5si0T7k0YpkAdTd3umGIvAq42mnbNezJVeAiEA+X7LFYODGxw+TI32Nm1U2YapCrNSkjZ1WJze8Z8Rvw8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.6.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1057629},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate.","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.20.0","@types/react":"^19.1.0","@stapel/tokens":"^0.6.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.8.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.6.1_1788050766833_0.8730283457447854","host":"s3://npm-registry-packages-npm-production"}},"0.6.2":{"name":"@stapel/chat-react","version":"0.6.2","license":"MIT","_id":"@stapel/chat-react@0.6.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"37da6cd4892193f8ac697006951f91eb7f0fffde","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.6.2.tgz","fileCount":266,"integrity":"sha512-1qm/EKVxAVcovvGLLrGNXw8+sMvBBs/e4PuuWM0wAkA3aPP/41z5xylgA4U9NCsofkt3UiH/EkKPs0x86RPaWw==","signatures":[{"sig":"MEYCIQCG+zHWFsI4Xh7ZDreFry86Ut0UpGeMb19wlCPtxHubbgIhAPp964uU3MWihbgyC7ha0xkgVKxeH50eKeCyRITvEqzE","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCDpYRlytWqwVhtwC5C9gRt3TuVUxXYuBUZHo91qHQMAQIhAP2trXKRpbioEU4pUG8DUx0k8PL62gFW3IxhcrQdLB6N","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.6.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1083494},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate.","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.23.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.14.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.6.2_1788364694555_0.8999899436905436","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@stapel/chat-react","version":"0.7.0","license":"MIT","_id":"@stapel/chat-react@0.7.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"42795a6316b39c43d99384299ff7687346b66a3f","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.7.0.tgz","fileCount":266,"integrity":"sha512-L+FES0IM7HtvxZWsWFaWgFC7YcduLTI1hzMHLLEIU1wrPUGSwCBpY9RDroQqHmU4b1fJwibJve8CFIe3GddVFQ==","signatures":[{"sig":"MEUCIQCO6JMmhi3xsrZ8hnD8Qli4vUF8GvKDCWDB6asnGiWjgAIgbLmq4E2zXG9cWZSzPb0j0DVY187i4zh+sYGttDKMHbI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCcxOsP01XIZo09t5xNlYuZ3sMzpTJQnidXsvnofNY3EAIgUvTcefEjpNmIYM8yPCaKIoWs/E3jgX3qFQNlTCxk64E=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1085169},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate.","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.23.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.14.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.7.0_1788369472059_0.33146999907640007","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"name":"@stapel/chat-react","version":"0.7.1","license":"MIT","_id":"@stapel/chat-react@0.7.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"bad3831293b49c6e781b37e58a4c607f18e45905","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.7.1.tgz","fileCount":266,"integrity":"sha512-gvbwk3B7B3pPp2GlddeTE28tvuUp8IXqSMpaJ4Y7RINqpR8R5glHUHFKJCLnIgaSoQBKqS22Mn0xpQEumOKo7w==","signatures":[{"sig":"MEUCIECCeOkHkpddnabC9tHKug7yVqp7zC0lpRhYfOuhHgbgAiEAjAl+eOxp4L2kxM13msbB7ju5/EnflmlfxvHtUGDnKjY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGlYrHW2NZuXV/jjBYIk/0I5n56cRgfabobUDNeh7BKiAiEAxMuH4+dGR+mj5JnsOV0xxZWpEAXHf/1qiFfVtUueM1Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1098956},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before.","path":"dist/default/index.js","limit":"14.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.23.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.15.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.7.1_1788380722446_0.3745378251597056","host":"s3://npm-registry-packages-npm-production"}},"0.7.2":{"name":"@stapel/chat-react","version":"0.7.2","license":"MIT","_id":"@stapel/chat-react@0.7.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"42f7bef9ed72927ca99e3eeb81a92ce80e42c0ab","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.7.2.tgz","fileCount":266,"integrity":"sha512-Li2pdJncizSHAN7YjnHUEbwsevPx0pYO1nGMgy2S5WQrNr7SPJ1VlsDbEIPx7Ye0vPvPYgCJsgxuK6gEGQ88zg==","signatures":[{"sig":"MEQCIAlMFOrsYoTCpSccksrgr0UT5koIVdzT/5H4pWcy6nQtAiBH9Wt2WvM7CzUIIvR2aSoqZbdvSUvn8LKo/9nOSnjaoQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHJk5FIqKFWc0jsPUaLxXCLwvJV4cY8peknKHI3Kv14kAiEAtJ/Vl4pUHX9SOYZ9OTll1R+31R8EuQO1hYx0DSZxBh4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.7.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1108445},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before.","path":"dist/default/index.js","limit":"14.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.23.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.16.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.7.2_1788396891210_0.45820359167458724","host":"s3://npm-registry-packages-npm-production"}},"0.7.3":{"name":"@stapel/chat-react","version":"0.7.3","license":"MIT","_id":"@stapel/chat-react@0.7.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5f874a25ed22b83a8197f6abe1b507049e80c0ab","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.7.3.tgz","fileCount":266,"integrity":"sha512-jMTiYI3pumeR+4QVbgaVE5zyq85ftpzlTd0HO2VQUk7NP4pAEPLrFJMubw/k4OSIUtFjWyjJbeeVrqI+bn6qOw==","signatures":[{"sig":"MEUCIQC0/JeKt9663NztohouziNsOiM9dnSpl1HU24rWGGBIsgIgeaLUxlGIIUUswU33WZyxYQbVT/1USlD96xM30a6taTE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCE9LlckcvUpj6fsbxWj974gvlhHNAmmf8dGR8jIqQJjgIgZzT8nwlIQ/Vjtf8Xul/jNsdJb2Dpu1ksnMiwS8ALLi0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.7.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1115522},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut.","path":"dist/default/index.js","limit":"14.7 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.24.0","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.16.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.7.3_1788439580411_0.4810453612505343","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@stapel/chat-react","version":"0.8.0","license":"MIT","_id":"@stapel/chat-react@0.8.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"c30abfe48e6fa03806b182b1e8d8005f388ca3c3","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.8.0.tgz","fileCount":266,"integrity":"sha512-fBAP+JsfiTq5Jiyj3sCQpyawPma9tzBIpYjeVLParQNvV7S4Egp5EOsVbx+jx6HGp8DhvwkCdt8pZeOqiCLEQA==","signatures":[{"sig":"MEYCIQCroWsYR16CR8RsWNDBTvwJmB1bhSAC1KyNXbecUFXcrwIhAI03S+bEtlpRr+etH1G4i4guN0IVjijo5/zyV9AdcJOg","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDOd8tY3zTdg+gTY8MhJ/d9DMUi2OI9TYBXvPuMmeizegIhAOzqKwo6jScAqS6TUNzpV+KtwZP/bmpXkHj1s7QGFo24","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1116159},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut.","path":"dist/default/index.js","limit":"14.7 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.8.0_1788523588835_0.31490846827814734","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@stapel/chat-react","version":"0.8.1","license":"MIT","_id":"@stapel/chat-react@0.8.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"48f23bbe1197b9a290ef83bf5294f3ca1f3ec1cc","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.8.1.tgz","fileCount":266,"integrity":"sha512-UsBL/aOzXfirlvzHAd5d8i8muP1xn3IIQmEA/8V1ob03yTJRTrLjTVmYOAiUGAfMtmsxz7DiwUqug5gXhqwfIA==","signatures":[{"sig":"MEUCIH6GIHQ5UHd5WIUWca/wXjUMBRJYp1OFMAZol7aMYUXEAiEAk55vd126igtCthC7WYWc0D4hGUuJiTgU+jCmXLJ+ld0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDT6FVz5No7bjVjF2zss9if9FjkfNpfX70bkzZtjeRLiwIgKQSv8DRwqcarLnyMPxq75BLciYTiADsAQUN1Y0XAV2I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1123674},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut.","path":"dist/default/index.js","limit":"14.7 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.1","@types/react":"^19.1.0","@stapel/tokens":"^0.7.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.8.1_1788603631225_0.10753102653608537","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@stapel/chat-react","version":"0.9.0","license":"MIT","_id":"@stapel/chat-react@0.9.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"f81ce0dc33886db24a0020d85788fe3bedabbfca","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.9.0.tgz","fileCount":266,"integrity":"sha512-bzMvLo3yBpMVg/pnkm+uDGeAABmQxXQxOcF6vkawbslhxsdJFbHJ579UN6xYpRb5yVxZygBrLDXBIz1Lg+2m9Q==","signatures":[{"sig":"MEYCIQDoySmzmEtarGO94qk3pOoGbgKNOST0CofanMtBkybwkwIhAOPH/bd4Gk2VnHHbIOyrZ8P+LmKMqMQ75P8PrU/Oy3Ob","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD7xJkkK2TV05nPFkhjJFYQetcI9PdYooC85kIQ3ucPKQIgUHUT/YOTjjfWBddKcpJJ7MulEAIzsFL7ZbPJS8UIKXk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1132859},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land.","path":"dist/default/index.js","limit":"14.9 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.2","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.9.0_1788618153491_0.29697845762566","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@stapel/chat-react","version":"0.9.1","license":"MIT","_id":"@stapel/chat-react@0.9.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"a080e1bd813b6315f1d763a6561895500bcee6c0","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.9.1.tgz","fileCount":271,"integrity":"sha512-nhJauQXLjHuHtQDCaAsFPXfLOrwQwf4hZYmdrErGPMz+LkEwvnGYy6mfGCmXqjnmnJUlSY6QP++9ezcVVtT8UA==","signatures":[{"sig":"MEUCIQDuykcht+GXAMzCiISpwAybx10+upz7EGz/stvrvG/K6QIgQTA6vrS3pgVE7bOJ3v8sK+9oLOpXrMJcx6PbXqsvdPM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQD6DUR+n8zzdFpQAmJ5yStIRU+UQ9UcFdLsM2pJBAnq+wIgQxM+H1sCcIFSTHqxeC8hur1StL7oR+w7Cr7F6z0iWkk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1153433},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B.","path":"dist/default/index.js","limit":"15.3 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.3","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.9.1_1788623226219_0.6545943496625881","host":"s3://npm-registry-packages-npm-production"}},"0.9.2":{"name":"@stapel/chat-react","version":"0.9.2","license":"MIT","_id":"@stapel/chat-react@0.9.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"9c478ea95758a2b160e33801354510c37032de5e","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.9.2.tgz","fileCount":271,"integrity":"sha512-Dmpa1ETtm4n9mBmSE3rYS8nm5drgT13suKiJKzMgTrq1QLNTMD/3CvB3/wVKeooaKn6n4cygt71YVoCmgHf3tw==","signatures":[{"sig":"MEQCID5TKVJYlom24IcHYrJ1+3du4k/701OhR7hirtyHnp6jAiBvYejH10vkOgXOfE6jOdIeGuzDEJ8N25nnHaHb14p9TA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDj49Q2MQZBttgsflD5/FV4jmbbUGL4segMidUbih4mdwIhAJM7MknBJgSNJDRUtKXVAgMU+HJCVRfwhIc8h+JzCZc0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.9.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1162595},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B.","path":"dist/default/index.js","limit":"15.3 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.2","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.9.2_1788631884171_0.672110465271099","host":"s3://npm-registry-packages-npm-production"}},"0.9.3":{"name":"@stapel/chat-react","version":"0.9.3","license":"MIT","_id":"@stapel/chat-react@0.9.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"8bd4fb867557719164ad37c9f01c02987ebae235","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.9.3.tgz","fileCount":271,"integrity":"sha512-+oc0wqKUhT592htTHeAVYFPttg1YrjPcWcV7tQHLwTkdPi4yKjHLIDm5N3WClgcrq8GNW/DbPztbPtYYVFa1hA==","signatures":[{"sig":"MEUCIQDIMbWSWNSBaJZWWOYS+3JUx7jDk+cQfjZS3VL6nO+d0QIgYJmeZGD3lN2CLBC9swqJm6JiDpXQdJku9zA0zBTWZy4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFgTpiedSt2HOJT4DD3UpRg041H8r2zNTl/UG19L4GyyAiEA70rNiKwLD6CtXDYQelnZHJr8njm2h8iIygULk/C9iCQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.9.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1186553},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB.","path":"dist/index.js","limit":"10.5 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all.","path":"dist/default/index.js","limit":"15.6 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.2","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.9.3_1788634881424_0.6507688434242445","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@stapel/chat-react","version":"0.10.0","license":"MIT","_id":"@stapel/chat-react@0.10.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"82f7d48a3efda84be24c5e42dd6713e67db436d1","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.10.0.tgz","fileCount":281,"integrity":"sha512-8u2ofAZe08iaC3BEwIQ9H2KKoTs3ZiCGdOFsBvtkTfbft3yPeXAynrUCO3TUCGi38sDeafu2qoXH0lgzZHRu6w==","signatures":[{"sig":"MEQCICJ8ZH+zPlQGX2UkQUmb+qYb+nFJLXEilsl2gcBVoZULAiAE4+YzdPuDQ88CoI+sAHIfSk8svP2Ib1u4fhE1ogt8ow==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDu9a8r3XK3jNkRpWW6RfmjPXFNkEAqpI1cPhmQow0Y3gIgTRsEkDawdfWZKO6ILaWmrbRDwS3+JrSi78bNJTX/Mhk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1231114},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react)","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot)","path":"dist/default/index.js","limit":"16.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.10.0_1788643775299_0.5024411975555465","host":"s3://npm-registry-packages-npm-production"}},"0.10.1":{"name":"@stapel/chat-react","version":"0.10.1","license":"MIT","_id":"@stapel/chat-react@0.10.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"dd27bf851b36cedab66b74e9bef4bb62cb074c08","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.10.1.tgz","fileCount":281,"integrity":"sha512-BW9nUv91V2QF8tzfZUBsqBPX3Pr7fT1UkpTKknxt28WfmcojMxrixRXcUuAcvjiE8VT9iFqw2CTnuq8bxn8q1w==","signatures":[{"sig":"MEQCIHs+lIY1REfAfpbO7N+7VTuzlZkCBb9LASGJ/rSPp71ZAiBsLxMDK7GUGphYHvFo/1YVffkf3ht0bUBEftKNeBzkuQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQChic40t6No2ymwW71uh/U4Jb/SM8vfGxEMjJNCUWI1HQIgbLlE86uxIHyjefpL9QmKOGKFeZRsz30Fw5f2jlb76lU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.10.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1247724},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB.","path":"dist/index.js","limit":"11.25 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte.","path":"dist/default/index.js","limit":"16.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.10.1_1788648778365_0.969900992033706","host":"s3://npm-registry-packages-npm-production"}},"0.10.2":{"name":"@stapel/chat-react","version":"0.10.2","license":"MIT","_id":"@stapel/chat-react@0.10.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"dd777dfde62d062f97f402993bb64d012ff5ae5b","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.10.2.tgz","fileCount":281,"integrity":"sha512-f0v55BWheywhkXwt20ufBlKcyDKoMZU+ZrJ8clTqz9s8IHXs41ZgiANuW1RrU2e64zgstTUTOvt5mYT/cDQlLg==","signatures":[{"sig":"MEUCIQCMlREcBtpj2P/OO3tvihXRW5NvqTNdvGwXtm2cDguzmwIgY5prE2GVPznC/XioSkp7/vMUxM5MT4MRzJktaEHP6ak=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIClwe+7Hy+Seyy5OrW6I2Zrjb5oS5avq/l4M2cKx0yKpAiAMZet14ZZ84XMkqFudl3hIK++N/jTJ65ERDPH31IkKUQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.10.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1253863},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB.","path":"dist/index.js","limit":"11.25 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte.","path":"dist/default/index.js","limit":"16.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.10.2_1788650771809_0.6715208129987078","host":"s3://npm-registry-packages-npm-production"}},"0.10.3":{"name":"@stapel/chat-react","version":"0.10.3","license":"MIT","_id":"@stapel/chat-react@0.10.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"92acc62047002652fa79c0bdfb434a0727135ba7","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.10.3.tgz","fileCount":281,"integrity":"sha512-XecP/RJROYKp0PDgdOULq8dh5br/jc5mhCd9owS9FOIbUQED10aWolESNt2Vvwaq4y3Ylj4i3A5+jPaAw+MHDQ==","signatures":[{"sig":"MEQCIQDkMpEr4I2hkuqCMvTF1lCQdaSnY04v1DcwmqvtNJbONgIfb7aL6xVaDpu8OK6DrLMURekA1tEei4jK1Mc1NgAr2w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBzdsTmicF9dAd8UGLtWysrdxLFc5q86TPj61Bz0MS/jAiAO1/SQGgazjTBI4FwSvArbHjS0w+dT2LWW7s0D1FI3KQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.10.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1258327},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB.","path":"dist/index.js","limit":"11.25 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte.","path":"dist/default/index.js","limit":"16.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB.","path":"dist/i18n/ru.js","limit":"5.2 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB.","path":"dist/i18n/es.js","limit":"4.3 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.10.3_1788653887446_0.35580017274969866","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@stapel/chat-react","version":"0.11.0","license":"MIT","_id":"@stapel/chat-react@0.11.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"3aa3f6a1b9f54548c538b1150c8f72608a7e64c9","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.11.0.tgz","fileCount":286,"integrity":"sha512-BMXTVUZjUZ+azY0X8B8C7k3tu9nwBF/2T2kh01vGa3KkBJpLtj2jW+KTTFjkEcxZwh1EuK/DOa2F9zQkj7d3fw==","signatures":[{"sig":"MEYCIQCF+lHwe2j1zl3BJyQ9laVbVuCeBwVrhXc4IugbEVoSEgIhALyW06b/SPZXapck8SJbF5ZeOOWQ6Pq+uhCMtNMTNYg+","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDkVcWwV2y+QIL6q7iQr7KOtVP9d0eWtpXKyTpsSqqmpAIgJIlGIMdYszdfNj6pO8dNV7PkAaI/SuTv0hSkWW+J2jo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1310729},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB.","path":"dist/index.js","limit":"11.25 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB.","path":"dist/default/index.js","limit":"17.3 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte).","path":"dist/i18n/ru.js","limit":"5.5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB.","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.11.0_1788683346271_0.31298258216449226","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@stapel/chat-react","version":"0.12.0","license":"MIT","_id":"@stapel/chat-react@0.12.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"24c29e5f929c9ffa3732f95e522fed26b94191af","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.12.0.tgz","fileCount":286,"integrity":"sha512-znsVNP7eHXY9ezNe0OBmttH7N15OpBWiVzjT9iqEXv8JXvwEWRV3dlinpyMxyC62qvFo0wbGMYrq7/b+CX8kyQ==","signatures":[{"sig":"MEQCIG1Cxc3EdBIlJxoaZHgq01KnoXfGvSE/PfUw8wD46qtPAiBWnRa2toxLo8yGACvAl2xvoCTsGKnDB94FOf+Cxyvcmg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBxlltTBZxQur30D54OTs+biwOGp2jQ96f57Uer8soX3AiBer1vFbzGzJBcDWpfghw9xTdjgvYaFCu3iTfRcAq5OTg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1358229},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last.","path":"dist/index.js","limit":"11.6 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB.","path":"dist/default/index.js","limit":"17.3 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB.","path":"dist/i18n/ru.js","limit":"5.5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB.","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.12.0_1788687073580_0.7664620352959612","host":"s3://npm-registry-packages-npm-production"}},"0.12.1":{"name":"@stapel/chat-react","version":"0.12.1","license":"MIT","_id":"@stapel/chat-react@0.12.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"83ce4255fa9822214b19d6dae67fbd8d15353297","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.12.1.tgz","fileCount":286,"integrity":"sha512-ye159jiebSqkR9MFpeUW1YErUJYY6blTAW3As/uhL85PybLBi61wDKXAPW7j3BFjcGo0qMx53gcTLvRcNJXW8A==","signatures":[{"sig":"MEQCIHh9OzfldMTduExRQck1nMAgOrRgmUGI+2pXLVDkjnioAiByxCpmyQ8mPufgPmHdElkxcwDio9sKsphDAhwKAmKYPw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH4IYG3/dTGucMGKcoa7UmedJ/7FOO0hvpHzh49j/EesAiBPCdSSM2//8IAg7lAUgoahBBnl+kIahDKRuHpJC+1qrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.12.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1368111},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last.","path":"dist/index.js","limit":"11.6 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB.","path":"dist/default/index.js","limit":"17.3 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB.","path":"dist/i18n/ru.js","limit":"5.5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB.","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.25.4","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.17.3","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.12.1_1788692530377_0.5239776641505884","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@stapel/chat-react","version":"0.13.0","license":"MIT","_id":"@stapel/chat-react@0.13.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5bcfecd663c5a3452a89f121e8065249df8cc168","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.13.0.tgz","fileCount":301,"integrity":"sha512-1dU0NHpW96/6vzEFLk9Vdd+mHPW3PgYlSfjvCQJqukWaFlxuEr6KAuvHt7XB0+JRiR0z/2P2t0w/swulVz1Hhg==","signatures":[{"sig":"MEQCIHcY6ORD9JA6lqroZgaWw7xcWwGTamTUb5UTKipItkgTAiBLglBXh5KjfMeIgslToPULMn64swgt9QLa1DaGVZK9qQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCMYLIwKV863tX74v8o2DTAWz1CGAOrtNBliuhYp+LmkAIhANk4JVhfZR6b7VhK8r6KYMPQretetbxtd76oIaT9g+jm","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1484678},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B.","path":"dist/default/index.js","limit":"18.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB.","path":"dist/i18n/ru.js","limit":"5.5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB.","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.0","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.13.0_1788713890059_0.6062165606381185","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@stapel/chat-react","version":"0.14.0","license":"MIT","_id":"@stapel/chat-react@0.14.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"90a8023aa285a6a085539d789a086699d1fae44a","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.14.0.tgz","fileCount":306,"integrity":"sha512-60mVorovQswdk+bPyYW1VsbLgAl3KsbOygInR/NTP5wxCGPvgykzErfNVtZNxWWIfKhvel7TUoUOifwPUrOAVQ==","signatures":[{"sig":"MEYCIQCIW1/2MFKAEw+XciOYDe+satOzX/2j5yuOvf5Z1oyTdwIhAKGKKXIETLFQsEPNObf8xCShXwJ469SugnzIWOp17Xoh","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHf98V3ok37mVa9wngwPoVwbD4+J6AoXITVz4Gsgc3FMAiBhHSitSYbDeqsUN+rzNyUB3vC61Co+eqwtvkmkIaRNRQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1595258},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave).","path":"dist/default/index.js","limit":"19.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.0","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.14.0_1788719403703_0.7620942599040657","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@stapel/chat-react","version":"0.14.1","license":"MIT","_id":"@stapel/chat-react@0.14.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5da5ad2f21b0697836b439792b75b63c772b7ccd","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.14.1.tgz","fileCount":306,"integrity":"sha512-nNZHWi67Iv9DOrwnDfOuA/nF3SAydDLMezNThK/NH16SRmMUhKYjPdnKt3qMVfl2C1FQErod/sH+DtSmjS9plw==","signatures":[{"sig":"MEUCIQCJ8wPt+OxF6BOZiiouwSZUW3iYNjKOu+RW71pudxLfhAIgJ0wDgGEEJ6f24c9Ngv7+CXRNXKYCKiC7nClY2htOty0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCyP1gQDq0r0JyYiNCbLY+ZHqlejFJEs91jmqBCm+sZ2AIgKX3+RCj+HSUK/HulbG6Q51xyOBYP8IP7xLntoSWH4kI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1603364},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave).","path":"dist/default/index.js","limit":"19.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.0","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.14.1_1788723056359_0.045200330057668214","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@stapel/chat-react","version":"0.15.0","license":"MIT","_id":"@stapel/chat-react@0.15.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"3dd7db47142fd870c8dca0fec53af6a227e5faa1","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.15.0.tgz","fileCount":306,"integrity":"sha512-gTa6EN47ZxovAMGXgVg6E9QThW5JybqQJun4BnshiBeOZq7mxTJRjWfUP+i9nBMjzy61V1wiXW4irymLbdL0OQ==","signatures":[{"sig":"MEQCIC2AtijIaVvLgW7NP4zQ43OGLcEZR/FDLhaOIiTinRSPAiAi616RHR8S/NLu56iw8NOgIxG85/G5KAWF4fOK8QObiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDs62rCmaBRpmwEMOo7Xldi2wCN/CunzgCSjBgaJ0M1WwIhAP84z08jBNCUv6smDuo9KXbS9zpaplxtIH4tqqZsM6y3","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1618552},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave).","path":"dist/default/index.js","limit":"19.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.15.0_1789001840260_0.6587626479909912","host":"s3://npm-registry-packages-npm-production"}},"0.16.0":{"name":"@stapel/chat-react","version":"0.16.0","license":"MIT","_id":"@stapel/chat-react@0.16.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5b45c155604db6ec1c91beae597da275da4dd73d","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.16.0.tgz","fileCount":306,"integrity":"sha512-JZJJiSxGckM+Tiufq9db0Fn0iOtHQuP3tA4U4yi6p95RTL7wTuLc4LjbGnYI8zE+XyHn6r0A8XnloCNbmakJKA==","signatures":[{"sig":"MEUCIEfxYBsmLk9XiSYaueS2aCyrfUANEC/8ihM11QiLobjYAiEA9I5JdeOkaWeqcqsPLCnVpKitgJB4Ln8nnRCkPyIW7O0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCAFEFa2zHvHfSTtcVkViyGxrSmxxvXCbyAHjGoOs2ZyAIgBBz5ZLvCVzhVy0goWUsw1XRWe1Daqw9Mpo/7/co7QdM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.16.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1639332},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave).","path":"dist/default/index.js","limit":"19.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.16.0_1789107935144_0.06411694567277504","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@stapel/chat-react","version":"0.17.0","license":"MIT","_id":"@stapel/chat-react@0.17.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"9925518ff614b8ac91ba820db573c2c572cdc489","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.17.0.tgz","fileCount":306,"integrity":"sha512-EolEPqnTX/mn1B1Z68LYLHUmURcIv8wpjS+wDSU5CWTGfOacFzT1oAtkmZxZplx3/n5SZw1bctI02h0HeamBqg==","signatures":[{"sig":"MEYCIQDAwTVyJGOhWGxAVL5MNdz+1Y7ziYW9sTRotAEVSHsFqQIhAPS1Bg9ZAQVSHzH3+Nz7zxWYX28vPxi48Pu/t8WCeW3B","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBmWHHzNsOONwSqAQhxEvhsYJ9pjzJPii3nXYEu1+bElAiAy45kQUepsF2BIhOIPk/S2W0yR+NIkhWNTcnTdvMLdiw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1644555},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave).","path":"dist/default/index.js","limit":"19.2 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.17.0_1789174581106_0.7808949531454841","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@stapel/chat-react","version":"0.18.0","license":"MIT","_id":"@stapel/chat-react@0.18.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"7fa14511fe7019e45ff8b8032d754cb512afabd9","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.18.0.tgz","fileCount":306,"integrity":"sha512-JRAscI1cYwOUNiXehtQnc8I3SPwmIMIdodiEbPd4LCfVtUjY8zQwtF541clwc3GCQamUSlkZPU5ZQZDN6qwiCA==","signatures":[{"sig":"MEUCIB9WRErre4IP7hMKPo7xtagkCrVItRVOG6GdNBcWNGWTAiEAlfvBYH6musvu7HP0qtBH+3fLPM37gT351AA9qudeOoA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDltu8gZiKJJ3UYu4WfPvRiN4HyZIp8FHugD4HyqXcXRAiB5Dt8hNbCMBrUpRMqYaN9UcPdGmvqm2WvAK0b6hHteIA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1657794},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte.","path":"dist/default/index.js","limit":"19.4 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.18.0_1789181344360_0.846979254904372","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@stapel/chat-react","version":"0.18.1","license":"MIT","_id":"@stapel/chat-react@0.18.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"7997ce14fece180d1c35a863e09d8d195b39ef79","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.18.1.tgz","fileCount":306,"integrity":"sha512-+ROpGW5fqCAs2rNYLtwkbjAZWjmQVEjmtfz/B9KX2FxcO08+hzjZWwUBEhHM4z85r/BD6Lrub/X5nCHLqhTcyA==","signatures":[{"sig":"MEYCIQD++BwD3N7uMAPA3ifwTO0vv0l4kfYp0LYDDF+aW3qs+wIhALfzWqbSi5t9Z3c7GOa85NG7UReSFp6bJgEp82ni0xum","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQD+TLGnUVuPqzf4sGlaaFSEQwk4/6BOHLAAgkoZEr1DiQIhAIqGTU2DePKnPFXjxO/eGUqAVw2KQ5nQufzCXzmw3/rw","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.18.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1663778},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"12.4 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte.","path":"dist/default/index.js","limit":"19.4 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word.","path":"dist/i18n/ru.js","limit":"5.8 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin.","path":"dist/i18n/es.js","limit":"4.8 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.19.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/tokens-antd":">=0.8.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.18.1_1789332567418_0.7255880008040703","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@stapel/chat-react","version":"0.19.0","license":"MIT","_id":"@stapel/chat-react@0.19.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"f28d08ea0df2ab62a6a821bda6b558fb048555f2","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.19.0.tgz","fileCount":326,"integrity":"sha512-rQygf4+HGfyX/4Mw5PXCkTqYCMXpNp9ExC2yyLMOwStWp8jOF/yeUF0WsW6JQg9z+/C9nRFon6/RVHD3dvd44g==","signatures":[{"sig":"MEQCIGSdhuVVAubUT1vmT0YY+SskVJsGSNWyT1Dy4YFMemURAiAipeQanVucUj4akwPnhuMWdWw0Fz6EFsPMT9e2ijXxkg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDfnwchofBIYAXoNOFL1PmVq6KuQPrtljEgntAp1Cy/FwIgBP0eUmefAyI493lrzC7ThpdDdVFaXJfNYAoM4J68rW0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1887426},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB.","path":"dist/default/index.js","limit":"24.1 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.5.0","@stapel/tokens-antd":"^0.20.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.5.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.19.0_1789337737276_0.9599398183510786","host":"s3://npm-registry-packages-npm-production"}},"0.19.1":{"name":"@stapel/chat-react","version":"0.19.1","license":"MIT","_id":"@stapel/chat-react@0.19.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"ab7c75f348ba04ac3cd1565126e40a1229903a9d","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.19.1.tgz","fileCount":326,"integrity":"sha512-Z5r5CioLILwqf82fFIq6PjwjXuGu92vyqCFDwTQImzHNpMmwjaMPZJxmkWxvqWukKcJnWaPkW5GOQgn2TxN7aw==","signatures":[{"sig":"MEQCICU4IK0mu3LebZL5O93MwPQjtVzliicxmrIBbaa7pXrrAiBCStvPlnU99cbQpz8weVg7iW81ceAw+osnNrCTz2yDgg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIBkPhse68+KHkKBs9YsNCNZ/ZVKRTFEcU+TN0zWzzuMQAiBxj839S3WQ4T34xG5P3kB9KSAxKk4pGmr4SYFLMz7M9g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.19.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1890095},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB.","path":"dist/default/index.js","limit":"24.1 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.5.0","@stapel/tokens-antd":"^0.21.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.5.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.19.1_1789339732091_0.5030313288200488","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@stapel/chat-react","version":"0.20.0","license":"MIT","_id":"@stapel/chat-react@0.20.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"51fe1d3a6ec9d5eba09f70ebce24b8cb48ce4cf4","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.20.0.tgz","fileCount":326,"integrity":"sha512-dFP7YU2m2TbL16IkleBYhlaBR7/hEYicfeFtmo1ZtjOXPJ0f7mk7z5yylfiB20xki9LLBvnMfOQ960Cy+yePlg==","signatures":[{"sig":"MEQCIHuBHW3hlaAQVeEic1+YQZBtfNGiTae9U0XWmhfodvfnAiB0zwX1iXa8l9lacZcqPa43tWQmKXyFlRyBbZTNCmKqzQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGda/6VUohOqZ4h4aSRH2JIHatmaBqeHes2lPKHeFCPuAiEA1bgBvTRGI8OCAxf9iU+JReLGv+cO3sFuSXXH+XaEebg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1913885},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. 0.20.0 does NOT move it: the inbox marks became one per TYPE (`inboxPreviewMarks` over stapel-chat 0.10.0's `attachment_types` / `attachment_count` — a glyph table, a dedupe on the GLYPH rather than the name, and the `+N`). Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 14.27 -> 14.44 KB, 170 B, which fits under the ceiling 0.19.0 set.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB. 0.20.0 does NOT move it either: the row's glyph strip draws the marks and the `+N`, and enters the accessibility tree as role=img in the one arm where the sentence beside it does not already say \"Attachment\" (a captioned photo). Measured on this dist with dependencies held constant, src at HEAD and then with the change: 23.64 -> 23.89 KB, 250 B.","path":"dist/default/index.js","limit":"24.1 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.0","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.5.0","@stapel/tokens-antd":"^0.22.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.5.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.20.0_1789400885919_0.43003417144159894","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@stapel/chat-react","version":"0.21.0","license":"MIT","_id":"@stapel/chat-react@0.21.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"4252933cda44e23da2fad89c873c93b7fb2f104b","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.21.0.tgz","fileCount":326,"integrity":"sha512-aA79o599zbQZ/Ta52NEasaus777bIH0MN0LE0NtySxNAlU00SPNs8vX6GhTf0EfAI4l96xLUFATZ00jvL3tZXQ==","signatures":[{"sig":"MEUCIH7wf416y8Ke2LYPYw1yxuvC/bKpTdoE/WMMb1+M6lT7AiEA9HXSjeVerfqM3Mj/A/SaH/GWk4ryp/oIhEWJuT8byiA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIB0/P2XTRTxojj0DF+tP9TyYPClPsTZKeDcm9eEH3v5cAiEA+TXge+qW7yfbkz0cg2vH9xx2OS3fyVQ/zoAAhMGgLKE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1939827},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. 0.20.0 does NOT move it: the inbox marks became one per TYPE (`inboxPreviewMarks` over stapel-chat 0.10.0's `attachment_types` / `attachment_count` — a glyph table, a dedupe on the GLYPH rather than the name, and the `+N`). Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 14.27 -> 14.44 KB, 170 B, which fits under the ceiling 0.19.0 set.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB. 0.20.0 does NOT move it either: the row's glyph strip draws the marks and the `+N`, and enters the accessibility tree as role=img in the one arm where the sentence beside it does not already say \"Attachment\" (a captioned photo). Measured on this dist with dependencies held constant, src at HEAD and then with the change: 23.64 -> 23.89 KB, 250 B. Raised 24.1 -> 24.8 KB in 0.21.0: the voice message, both ways. The compose half is `VoiceAttachButton` — cdn-react's `<VoiceRecordButton>` reached through `@stapel/cdn-react/default` (a second subpath import, and the bytes are mostly that control's: the recording row, the meter, the six refusals), its take wrapped as a File named from its container and handed to the draft as `audio`, plus the chip that says «Voice message» instead of a timestamped filename and the `voice` switch threaded through the thread panel and the split panel. The read half is the player the voice arm became: a reserved row height, `aria-pressed` on the one control, a playhead drawn over the strip from the element's own `timeupdate` with the server's length as its denominator (or the decoded one for a clip nobody measured), and the elapsed clock beside the total while it plays. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 23.89 -> 24.40 KB, 510 B. A 400 B ceiling over the measured figure.","path":"dist/default/index.js","limit":"24.8 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.1","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.6.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.6.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.21.0_1789415229574_0.781823049422121","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@stapel/chat-react","version":"0.22.0","license":"MIT","_id":"@stapel/chat-react@0.22.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"e8d003ca205263b7f356a34dcca12120db9fedec","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.22.0.tgz","fileCount":326,"integrity":"sha512-dLcXUMXiqOeZoX1eHU2N7GHHG/9anPQyfZvF67Pxfi/KmyIdM+2yKAfdvlYy5ycuybB+U7Z2Q2w/tY0FnN7M6g==","signatures":[{"sig":"MEYCIQD4ZWlq0lQvlXzwYxVDK/BPjBKHEkh1TfBI/P4brP4TfAIhAJZfphK1l48f0HbGSAh992TKcYeEcqJeSMXXkd0Q+F1H","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGyUgx8G14hCUe8ShUv48J0Sb8kp7S4wbOuszSax5mbSAiEAgwwGYRutmvfVOv2ztCKFa1jbsTFqkmnjtgUyIQCX7dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1943751},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. 0.20.0 does NOT move it: the inbox marks became one per TYPE (`inboxPreviewMarks` over stapel-chat 0.10.0's `attachment_types` / `attachment_count` — a glyph table, a dedupe on the GLYPH rather than the name, and the `+N`). Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 14.27 -> 14.44 KB, 170 B, which fits under the ceiling 0.19.0 set.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB. 0.20.0 does NOT move it either: the row's glyph strip draws the marks and the `+N`, and enters the accessibility tree as role=img in the one arm where the sentence beside it does not already say \"Attachment\" (a captioned photo). Measured on this dist with dependencies held constant, src at HEAD and then with the change: 23.64 -> 23.89 KB, 250 B. Raised 24.1 -> 24.8 KB in 0.21.0: the voice message, both ways. The compose half is `VoiceAttachButton` — cdn-react's `<VoiceRecordButton>` reached through `@stapel/cdn-react/default` (a second subpath import, and the bytes are mostly that control's: the recording row, the meter, the six refusals), its take wrapped as a File named from its container and handed to the draft as `audio`, plus the chip that says «Voice message» instead of a timestamped filename and the `voice` switch threaded through the thread panel and the split panel. The read half is the player the voice arm became: a reserved row height, `aria-pressed` on the one control, a playhead drawn over the strip from the element's own `timeupdate` with the server's length as its denominator (or the decoded one for a clip nobody measured), and the elapsed clock beside the total while it plays. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 23.89 -> 24.40 KB, 510 B. A 400 B ceiling over the measured figure.","path":"dist/default/index.js","limit":"24.8 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.26.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.1","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.6.1","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.6.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/chat-react_0.22.0_1789711988438_0.9210314100168706","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"_id":"@stapel/chat-react@0.23.0","dist":{"shasum":"9632165e35a79d528332220af440c8e9c5ad7040","tarball":"https://registry.npmjs.org/@stapel/chat-react/-/chat-react-0.23.0.tgz","fileCount":326,"integrity":"sha512-G+c+nmpUo+PU8rfi2QKZH6sjKMDOd+7baoifD6hnZGZE2icCGlObBo0kLGZAYhRCZ8+8JErY22LGWn3Z3KHthA==","signatures":[{"sig":"MEQCIDG3WMlbQVGS6kzXXay1f5Y6PkmJwQBreNDxj4QFwNhGAiAX/F0jGXy1NVteSj05ANOxdpwyE/pi7seMdGG1KQGTHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQD0Xf/uqwZPWxIrf1fdgOERBfXeI/qWSBmG2Nc2Zv0CMwIhAIfKs92FzLuALTztnv9R5f4QyFGk8pJMQiGjzCsUDbGo"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2fchat-react@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1946827},"main":"./dist/index.js","name":"@stapel/chat-react","type":"module","types":"./dist/index.d.ts","engines":{"node":">=22"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./default":{"types":"./dist/default/index.d.ts","default":"./dist/default/index.js"},"./i18n/es":{"types":"./dist/i18n/es.d.ts","default":"./dist/i18n/es.js"},"./i18n/ru":{"types":"./dist/i18n/ru.d.ts","default":"./dist/i18n/ru.js"},"./llms.txt":"./llms.txt","./manifest":"./manifest.json","./nav-manifest":"./nav-manifest.json","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"license":"MIT","scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.demo.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"version":"0.23.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c4ce2a15-81ed-4a5e-8b9e-39aa92c59545"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"size-limit":[{"name":"index — headless pair (client + hooks + thread store + transport seam). Raised 9 -> 9.5 KB: measured 9.20 KB before the elevation gate landed (the in-flight subject/person work) and 9.28 KB after it (core's useElevation in StartDirectChat, ~83 B) Raised 9.5 -> 10.5 KB in 0.6.0: the presence reader/applier and the notification rules (model/presence.ts, model/notifications.ts) are headless by design. Measured 10.11 KB. (10.5 -> 11 KB in 0.10.0: <StartCall>, the gate for the call control — six blocked arms and no call-placing code, because calling lives in @stapel/video-react) Raised 11 -> 11.25 KB in 0.10.1: `<StartCall ensureConversation>` — the seam that lets a press make the thread it needs (a listing page has no conversation until somebody writes), plus the in-flight state and the thrown value the gate's own vocabulary cannot say. Measured with dependencies held constant, this package's src at HEAD and then with the change: 10.66 -> 10.80 KB. Raised 11.25 -> 11.6 KB in 0.12.0: the inbox filter became a QUERY (`model/inboxQuery.ts` — normalize, debounce, the settled filter that keys the list) and the row's last line became a pure function over the server's projection (`model/previews.ts`, which lost the `useQueries` cache-reader it replaced). Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 10.675 -> 10.914 KB — 239 B. The ceiling moves further than the change because this figure is measured WITH dependencies: the same dist measured 11.18 KB earlier in the same session, with a different build of @stapel/core's dist under it (a shared tree, mid-wave), and 10.91 KB after it settled. A 340 B ceiling over the higher of two honest readings of the same bytes is a gate that measures this package; 70 B over it is a gate that measures whoever built core last. Raised 11.6 -> 12 KB in 0.13.0: leaving a conversation. What lands in the HEADLESS entry is the whole rule and none of the surface — `useLeaveConversation` with the cache write that takes the row out of every narrowing of the list, `model/membership.ts` (the `left_at` reader, which is the header's answer to \"is this person still in the room\") and `model/systemLines.ts` (the marker table that turns `chat.participant.left:<uuid>` into a sentence) — plus the seven en floor strings those need. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 11.219 -> 11.631 KB, 412 B. A 370 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12 -> 12.4 KB in 0.14.0: the threads you left, and the way back. What lands in the HEADLESS entry is again the whole rule and none of the surface — `useRejoinConversation` (with the cache write that takes the row out of the LEFT narrowings only, because leaving and returning move a thread BETWEEN two lists under one prefix and a helper that swept the prefix would delete the row from the list it had just arrived on), `useRejoinSupported` (the deployment-wide 404 flag, subscribed to the query cache so every control on the screen goes at once rather than one press at a time), `conversationLeftAt`, the `left` segment of the list key and the `view` axis of the settled filter — plus the six en floor strings those need. Measured on this dist with dependencies held constant: 11.948 KB, against the 11.631 KB the same entry measured for 0.13.0 (and 11.63 KB on this tree at the head of this wave). A 452 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. Raised 12.4 -> 14.7 KB in 0.19.0: ATTACHMENTS, and what lands in the HEADLESS entry is the whole rule and none of the pixels. `model/attachments.ts` is the decode — which arm a descriptor belongs to (the registry TYPE, which is the CDN's kind, never a mime sniff), the tolerant read that drops an unreadable entry without taking the other nine with it, the ladder conversion into `@stapel/image`'s spelling at ONE boundary, and `reservedAspect`, which is the no-layout-jump rule written down: the measured aspect, then width/height, then the shape `preview_kind` implies (known from the type alone, so known while the preview is still null), then deliberately NOTHING for a still with no geometry, because a guessed box has to jump twice. `headless/useAttachmentDraft.ts` is the pending list: the per-file phase, the abort handles and object URLs kept out of state, the two blocks that are two because \"wait\" and \"remove or retry it\" are different next actions, and the `{key, type}` payload. Plus the composer's new emptiness rule (an attachment IS a message, so a photo with no words may be sent) and the inbox glyph. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 12.09 -> 14.27 KB, 2.18 KB. A 430 B ceiling over the measured figure is a gate that measures this package rather than whoever built core last. 0.20.0 does NOT move it: the inbox marks became one per TYPE (`inboxPreviewMarks` over stapel-chat 0.10.0's `attachment_types` / `attachment_count` — a glyph table, a dedupe on the GLYPH rather than the name, and the `+N`). Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 14.27 -> 14.44 KB, 170 B, which fits under the ceiling 0.19.0 set.","path":"dist/index.js","limit":"14.7 KB"},{"name":"default — the antd chat skin must stay out of the main bundle. Raised 10 -> 13 KB: measured 12.17 KB after the inbox row became a person (avatar + name + subject + preview through the host people seam), the thread gained the pinned subject card and the report/block overflow sheet. The ceiling is the split, not the size — this subpath is opt-in and antd-carrying by design Raised 13 -> 14 KB in 0.6.0: the presence line and the notifications pre-prompt on the shared permission substrate. Raised 14 -> 14.5 KB in 0.7.1: the notification ask stopped being a modal (D64). PermissionSheet was ONE imported component; an ask that does not take the screen hostage is markup this package owns — an alert, its two controls and the denied arm — plus the whole-row link that made an inbox row one control instead of a name button (D65). Measured 14.33 KB against 13.97 KB before. Raised 14.5 -> 14.7 KB in 0.7.3: the conversation row's :focus-visible ring (D65 left the largest focus target on the screen with outline-style: none). Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 14.39 -> 14.53 KB, 140 B for a rule an inline style cannot state. 20 B of that was incidental and is gone — a single-element array joined to a string, a second constant for the hoist key the class name already was, and the style element written once per branch instead of once — which leaves 14.51 KB and no fat left to cut. Raised 14.7 -> 14.9 KB in 0.9.0: `<StartChatButton refusal>` pulls the skin's `GatedButton` into this subpath, which is the whole point of the change — fourteen cards printed fourteen copies of one sentence, and pooling it into the enclosing `PaneGate` is the skin's mechanism, not a second copy of gate wiring kept in step by hand. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.66 -> 14.74 KB, 80 B for a third arm on the control and the pooled binding under it. The wrapper was already written twice by then and is now written once — the column and its error line are the same three nodes in all three arms — which took 13 B of that back and leaves one place for a change to the column to land. Raised 14.9 -> 15.3 KB in 0.9.1: the pooled refusal got its door back. 0.9.0 moved the sentence into the pane's footnote and left `SignInLink` behind in the inline arm, which is this module's own half-answer — a reason with no way out. Putting ONE door in the pooled sentence (rather than one under each of fourteen cards) costs the claim that elects a single control per pane and the portal that renders into the sentence's own element. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 14.74 -> 15.07 KB, 330 B. Raised 15.3 -> 15.6 KB in 0.9.3: the inbox row reaches the listing (D420). The row was one control with one destination and now has two — the subject title is a link out — which is a second element, its props, the class the :hover/:focus-visible rule needs (an inline style cannot state either), and the strip moved out from under the row control so the two are siblings rather than an anchor inside an anchor. Measured with dependencies held constant, this package's src at the previous commit and then at this one: 15.16 -> 15.41 KB, 250 B for the one move a seller standing in their inbox could not make at all. (15.6 -> 16.2 KB in 0.10.0: <StartCallButton> and the thread header's renderHeaderActions slot) Raised 16.2 -> 16.5 KB in 0.10.1: the call button now renders the pair's own error surface for a press that had to CREATE the thread first (`ErrorAlert` reaches this subpath from `<StartCallButton>`), and the split panel forwards the header-actions slot. Measured with dependencies held constant, src at HEAD and then with the change: 15.95 -> 16.13 KB — 180 B, and a ceiling with 70 B of room left is a gate that fails on the next honest byte. Raised 16.5 -> 17.3 KB in 0.11.0: the thread list gained a toolbar — a search field, an \"Unread\" chip, the filtered-empty arm and the sentence that states what the filter is over. The bytes are mostly antd's, not this file's: `Input` (with its affix wrapper) and `Tag.CheckableTag` are two components this subpath did not import before, and measuring the field WITHOUT `allowClear` came back at 17.04 KB — larger, inside the rounding — so the clear button is free and stays. Measured with dependencies held constant, this package's src at HEAD and then with the change: 16.26 -> 17.00 KB. 0.12.0 SHRINKS it and the ceiling stays where it is: the client-side predicate and the scope sentence are gone (the server filters now), the preview logic moved to the headless layer, and what came back is one hoisted toolbar and a second empty arm. Measured on a clean dist with dependencies held constant, src at HEAD and then with the change: 16.599 -> 16.534 KB. Raised 17.3 -> 18.5 KB in 0.13.0: a person can leave a conversation, and the confirmation that says what that means. Three surfaces, not one: the confirmation itself (`LeaveConversationDialog` — a second `SkinDialog` in this subpath, with a footer, a danger control and the pair's own error surface for the one refusal `DELETE` has), the trigger it is opened from, and an INBOX ROW's own overflow menu, which is a third dialog and the flex line that puts it beside the row control rather than inside it (a button inside an anchor is the nesting D420 already moved the subject strip out of). The dialog cannot live inside either menu — a `SkinDialog` destroys its children when it hides, so the confirmation would be unmounted by the press that opened it — which is why each menu carries its own flag and renders the dialog as a sibling. Also in the figure: the header's `left_at` arm, and the departure line drawn as a sentence with a name in it. Measured on a clean dist with dependencies held constant, this package's src at HEAD and then with the change: 16.990 -> 18.068 KB, 1078 B. Raised 18.5 -> 19.2 KB in 0.14.0: the inbox grew a second list. Three things, and the first is most of the bytes: `Segmented` is an antd component this subpath did not import before, and it is what a two-way exclusive choice renders as — two `CheckableTag`s would be checkboxes, and a checkbox pair says a person may tick both and see the union, which is an answer `?left=true` (the exact complement of the inbox) cannot give. Then `<RejoinConversationButton/>`, which is a control plus the pair's own error surface for the one refusal it has and an arm that renders NOTHING on a deployment whose rejoin answered 404. Then the row's departure strip — the «Left <date>» line beside that control, below the row control as its sibling — the third empty arm, and the placeholder that swaps on the left tab. Measured on this dist with dependencies held constant: 18.784 KB, against the 18.068 KB the same entry measured for 0.13.0 (and 18.07 KB on this tree at the head of this wave). Raised 19.2 -> 19.4 KB in 0.18.0: the inbox clock became three arms and a seam. The stamp a row draws is now decided rather than formatted — same-day, same-year and older, each with its own `Intl` options — and the row asks a host's `formatTime` first, which is a prop threaded through the list panel, the rows and the split panel that forwards it. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.06 -> 19.18 KB, 120 B. The old ceiling had 20 B of room left at the new figure, which is a gate that fails on the next honest byte. Raised 19.4 -> 24.1 KB in 0.19.0: five new surfaces in this subpath, and the four that cost most are the four ATTACHMENT ARMS, which are four because four is how many genuinely different renders there are. A picture is `<Image>` over the ladder inside a real `<button>` (opening it is an action a keyboard has to be able to take) plus a `SkinDialog` lightbox — a second dialog in this subpath, and `contain` rather than `cover`, because cropping the thing somebody tapped to look at is the one thing a lightbox must not do. A clip is a native player at `preload=\"none\"` over the poster the CDN made. A voice message is the waveform image, a gated play control and the length — or the sentence that says nobody measured it, which is a different fact from zero. A document is facts and, when the wire carries no URL for it, the STATED absence of a link rather than one built out of the opaque key. Then the compose half: two pickers whose `accept` comes from the intake each one's files land in, and the chip strip with its step, its retry and its remove. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 19.29 -> 23.64 KB, 4.35 KB. 0.20.0 does NOT move it either: the row's glyph strip draws the marks and the `+N`, and enters the accessibility tree as role=img in the one arm where the sentence beside it does not already say \"Attachment\" (a captioned photo). Measured on this dist with dependencies held constant, src at HEAD and then with the change: 23.64 -> 23.89 KB, 250 B. Raised 24.1 -> 24.8 KB in 0.21.0: the voice message, both ways. The compose half is `VoiceAttachButton` — cdn-react's `<VoiceRecordButton>` reached through `@stapel/cdn-react/default` (a second subpath import, and the bytes are mostly that control's: the recording row, the meter, the six refusals), its take wrapped as a File named from its container and handed to the draft as `audio`, plus the chip that says «Voice message» instead of a timestamped filename and the `voice` switch threaded through the thread panel and the split panel. The read half is the player the voice arm became: a reserved row height, `aria-pressed` on the one control, a playhead drawn over the strip from the element's own `timeupdate` with the server's length as its denominator (or the decoded one for a clip nobody measured), and the elapsed clock beside the total while it plays. Measured on this dist with dependencies held constant, this package's src at HEAD and then with the change: 23.89 -> 24.40 KB, 510 B. A 400 B ceiling over the measured figure.","path":"dist/default/index.js","limit":"24.8 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry (4.5 KB since the wire cutover: four more NAMED degradations, in full sentences, is the point of them). Raised 4.5 -> 4.8 KB: measured 4.46 KB with the person/subject/menu copy, which leaves no room for a word Raised again 4.8 -> 5.2 KB in 0.6.0: presence and the notifications pre-prompt add seven keys, three of them full sentences — the permission copy has to say what the offer is FOR before a browser prompt appears, and a short version of that sentence is how a person refuses something they did not understand. Measured 4.79 KB. Raised 5.2 -> 5.5 KB in 0.11.0: the inbox toolbar's five keys — the field's accessible name and its placeholder, the chip, the filtered-empty sentence and the scope line that says the filter is over the conversations loaded so far. Measured 4.79 -> 5.17 KB (5.02 KB was the figure before this change; the ceiling had 30 B of room left, which is a gate that fails on the next honest byte). 0.12.0: two keys in, one out — the row's wordless previews (\"Системное сообщение\", \"Вложение\") arrive and the scope sentence leaves, which is a net loss of bytes. Measured on a clean dist: 5.054 -> 5.015 KB. Raised 5.5 -> 5.8 KB in 0.14.0: six keys — the two tab labels, the left list's own empty sentence (never «Диалогов пока нет.», which over the left tab would tell a person with three hundred threads that they have none), the departure line, the way back and its pending state, and the search placeholder that drops the inbox's «или сообщение» because a left thread's last line is the departure marker and nothing finds an unlabelled marker. Measured on this dist with the six keys removed and then restored, dependencies held constant: 5.402 -> 5.482 KB, 80 B. The ceiling had 18 B of room left at the new figure, which is a gate that fails on the next honest word. Raised 5.8 -> 6.6 KB in 0.19.0: the attachment vocabulary, twenty-six keys in two halves. The compose half is controls plus the three blocks a draft can be in (full / still uploading / one failed), each a separate sentence because each has its own next action. The read half is what a reader who gets no pixels is told a bubble contains — four alt texts naming the MEDIUM, since the CDN has no description of the content and inventing one would be worse than naming the kind — plus play/pause, the download, the unmeasured-length sentence, the stated absence of a link, and the two meta-status notes. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 5.57 -> 6.24 KB, 670 B.","path":"dist/i18n/ru.js","limit":"6.6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 3.8 KB: measured 3.62 KB with the eleven keys the person/subject/menu copy added Raised again 3.8 -> 4.3 KB in 0.6.0: the same seven presence + notification-permission keys. Measured 3.94 KB. Raised 4.3 -> 4.5 KB in 0.11.0: the same five inbox-toolbar keys. Measured with dependencies held constant: 4.14 -> 4.25 KB. 0.12.0: the same two-in-one-out trade as ru. Measured on a clean dist: 4.154 -> 4.137 KB. Raised 4.5 -> 4.8 KB in 0.14.0: the same six keys. Measured on this dist with them removed and then restored, dependencies held constant: 4.471 -> 4.527 KB, 56 B — which took the entry 27 B PAST its old ceiling, so the raise is the measurement and not a margin. Raised 4.8 -> 5.5 KB in 0.19.0: the same twenty-six attachment keys. Measured on this dist with dependencies held constant, src at HEAD and then with the change: 4.60 -> 5.13 KB, 530 B.","path":"dist/i18n/es.js","limit":"5.5 KB"}],"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","directories":{},"maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"msw":"^2.10.2","antd":"^6.5.0","jsdom":"^26.1.0","react":"^19.1.0","vitest":"^3.2.4","react-dom":"^19.1.0","size-limit":"^11.2.0","typescript":"^5.8.3","@stapel/core":"^0.29.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.1","@stapel/realtime":"^0.1.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/cdn-react":"^0.8.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=6.0.0 <7","react":">=19","react-dom":">=19","@stapel/core":">=0.20.0 <1.0.0","@stapel/image":">=0.2.0 <1.0.0","@stapel/realtime":">=0.1.1","@stapel/cdn-react":">=0.8.0 <1.0.0","@stapel/tokens-antd":">=0.20.0","@tanstack/react-query":"^5.0.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/image":{"optional":true},"@stapel/cdn-react":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/chat-react_0.23.0_1790520026419_0.5137296144372645"}}},"time":{"created":"2026-08-22T13:07:04.495Z","modified":"2026-09-27T14:40:26.939Z","0.1.0":"2026-08-22T13:07:04.964Z","0.2.0":"2026-08-22T23:27:55.617Z","0.3.0":"2026-08-23T08:03:37.639Z","0.3.1":"2026-08-23T17:34:59.975Z","0.4.0":"2026-08-26T20:58:57.773Z","0.5.0":"2026-08-28T03:53:23.151Z","0.6.0":"2026-08-29T23:07:25.037Z","0.6.1":"2026-08-30T00:46:06.958Z","0.6.2":"2026-09-02T15:58:14.698Z","0.7.0":"2026-09-02T17:17:52.144Z","0.7.1":"2026-09-02T20:25:22.571Z","0.7.2":"2026-09-03T00:54:51.358Z","0.7.3":"2026-09-03T12:46:20.504Z","0.8.0":"2026-09-04T12:06:28.948Z","0.8.1":"2026-09-05T10:20:31.338Z","0.9.0":"2026-09-05T14:22:33.616Z","0.9.1":"2026-09-05T15:47:06.357Z","0.9.2":"2026-09-05T18:11:24.273Z","0.9.3":"2026-09-05T19:01:21.514Z","0.10.0":"2026-09-05T21:29:35.403Z","0.10.1":"2026-09-05T22:52:58.484Z","0.10.2":"2026-09-05T23:26:11.960Z","0.10.3":"2026-09-06T00:18:07.612Z","0.11.0":"2026-09-06T08:29:06.389Z","0.12.0":"2026-09-06T09:31:13.669Z","0.12.1":"2026-09-06T11:02:10.489Z","0.13.0":"2026-09-06T16:58:10.197Z","0.14.0":"2026-09-06T18:30:03.813Z","0.14.1":"2026-09-06T19:30:56.447Z","0.15.0":"2026-09-10T00:57:20.357Z","0.16.0":"2026-09-11T06:25:35.277Z","0.17.0":"2026-09-12T00:56:21.216Z","0.18.0":"2026-09-12T02:49:04.511Z","0.18.1":"2026-09-13T20:49:27.521Z","0.19.0":"2026-09-13T22:15:37.370Z","0.19.1":"2026-09-13T22:48:52.202Z","0.20.0":"2026-09-14T15:48:06.068Z","0.21.0":"2026-09-14T19:47:09.671Z","0.22.0":"2026-09-18T06:13:08.539Z","0.23.0":"2026-09-27T14:40:26.577Z"},"license":"MIT","repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/chat-react"},"description":"Headless React pair for stapel-chat: typed API client, TanStack Query hooks, a seq-ordered thread store, and ONE transport seam behind which the module's own resumable WebSocket protocol (hello/welcome/replay/replay_done/message/error) and seq-anchored po","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"readme":"","readmeFilename":""}