{"_id":"@stapel/listings-react","_rev":"66-b4d63f0e43c3133c24c7422350491245","name":"@stapel/listings-react","dist-tags":{"latest":"0.39.0"},"versions":{"0.1.0":{"name":"@stapel/listings-react","version":"0.1.0","license":"MIT","_id":"@stapel/listings-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":"d329bd0eb2935e5f26a3fd19d30311ea5f6010d6","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.1.0.tgz","fileCount":225,"integrity":"sha512-vjHEZDE1zs9e8KVyZ123Vmh3Nx6oLyeYCL3SCQ9YetIOtUJEjYP4NQRuEct1Xq+jhXZvWFyVtGf80/tZHgHDSA==","signatures":[{"sig":"MEUCIQD5OyXudIruyrMgMcsNxuhfUfOiravdlBz3SRiKJc02QQIgcApdBkrxx4XHuw7jFqDJ9Hk1clsHq9xKxV/huVAoHjA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":953943},"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","./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.test.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/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","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"}],"_npmVersion":"10.9.2","description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.13.1","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"workspace:^","@stapel/tokens":"workspace:^","@stapel/showcase":"workspace:^","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"workspace:^","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"workspace:^","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.15.0 <1.0.0","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.5.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.1.0_1787404044910_0.5258972538648283","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@stapel/listings-react","version":"0.2.0","license":"MIT","_id":"@stapel/listings-react@0.2.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"8b3916f37f24c394a937343905dc1f57a1b50453","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.2.0.tgz","fileCount":226,"integrity":"sha512-7KEw8zu/eFcL7IAaWghj9bjt0AQmmSPCFkw4CWzO6AXlZ3wcTZi/qeuILM7T5wnnw5+gVs/BRG1zJhGBjmsMeQ==","signatures":[{"sig":"MEQCIAvuFIWTTp14T0eFV+R00rpebweY2/Ds4YkHYblj5DEHAiBHW8eLOSdYT2rsUhs2JELEfjaRp/JcDzFeRkh6e5rqEg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":958678},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.2.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.5.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.2.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","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.5.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.2.0_1787441275685_0.4247191808930644","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@stapel/listings-react","version":"0.3.0","license":"MIT","_id":"@stapel/listings-react@0.3.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"ce9e96ed05cad10a939d4a3444dfd8f863de6879","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.3.0.tgz","fileCount":231,"integrity":"sha512-/D7ayN2jTsAzJMRv64hVy4WntSoJODuc4apZinTsTqTKbOoxBM4AGLhFLkLcpiZYBjI+WVSiDWvhgUZur4aaSw==","signatures":[{"sig":"MEUCIQD5yhPUzMA7/d4mqt5VuXC/BvRXkra8iGaE8OPqwI9K3wIgL06c0RzOC/UxI1Lx+j1WvXTJyogxi17ssNAzu+5Sq3w=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1003231},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.2.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.5.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.2.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","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.5.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.3.0_1787472217776_0.1701089341310491","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@stapel/listings-react","version":"0.3.1","license":"MIT","_id":"@stapel/listings-react@0.3.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"de210282406d54434bc88fdbb24fdd133724bdc8","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.3.1.tgz","fileCount":231,"integrity":"sha512-dwQFNsrATVXxN1t/1ezhAX+BHP5bYSS1tCF86KrFBfGQcPv8sCpOktT0GskjPCLsYgLl1zoANBRfs/tWVXqwxg==","signatures":[{"sig":"MEYCIQCbwhIfWpTGQh9ZlLvZO6SeQXBciidmfuXOUMNpLlkrvgIhANqqjLX2QUEN6Y/IJb1HlQp7IRbOw4yF+PUoZnG+hZC2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.3.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1006660},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.3.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.5.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.5.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.3.1_1787506500302_0.027164517256634824","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@stapel/listings-react","version":"0.4.0","license":"MIT","_id":"@stapel/listings-react@0.4.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"4cf31c83cb3ad7c5ece0620de23f874464a4828a","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.4.0.tgz","fileCount":236,"integrity":"sha512-tvYYVvGOide3ECzusH/NnQ7ftPR7KNvJmJkyu7RLo/MgBZC+tgunIBsS8UD/z4n54pboKwFKp2kUeJDHwGrokQ==","signatures":[{"sig":"MEUCIAboIBl8gRRRBtvBgHuDsSJQcq6T3xWJcenm7cNEfnwMAiEA/VXczlYHQUtXfhrNehqItQjTgGPBZmuj/G0Pn+UohWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1064450},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard) must stay out of the main bundle","path":"dist/default/index.js","limit":"14 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.3.0","@stapel/tokens":"^0.5.0","@stapel/showcase":"^0.2.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.5.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.5.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.4.0_1787522280542_0.8901870046325009","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@stapel/listings-react","version":"0.7.0","license":"MIT","_id":"@stapel/listings-react@0.7.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"7c7ef0f71fe9005e604822857c8d597843330886","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.7.0.tgz","fileCount":231,"integrity":"sha512-6UenSs7Xmh1947L+/uuxIf49nFGBen4/X6WgFd0kUbvCqYHhGbTIuFe9twGVWiQ8O7ih7ec6SPSNJscywrbujw==","signatures":[{"sig":"MEUCIGj0ymvUHZYAX9H8Ci+CMxW7DvAyCH9pOMAQZhxTumrsAiEAzfsaiQunF4189ljJRm5KwsZEgO1WNFaC2qjON5b5xxA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1167392},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd","path":"dist/index.js","limit":"11 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle","path":"dist/default/index.js","limit":"16 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.1","@stapel/tokens":"^0.5.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","@stapel/attributes-react":"^0.3.1","@stapel/currencies-react":"^0.2.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.18.1 <1.0.0","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.7.0_1787777944553_0.6522016112581897","host":"s3://npm-registry-packages-npm-production"}},"0.8.0":{"name":"@stapel/listings-react","version":"0.8.0","license":"MIT","_id":"@stapel/listings-react@0.8.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"27629c9b4c58d9f458e758cd1471adc43b1bf42d","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.8.0.tgz","fileCount":231,"integrity":"sha512-E1v4RCQ+7e4CbeRra6zVWgq2Wrxx0Jtmi5k4uwa/Tie7lRIIGfrMtqeslwvBmGyDKkUW6ntaGi1/AQiyzvP+bw==","signatures":[{"sig":"MEUCIQCXX475Dm/hypt0kRu9IwapYGVCm1FKLuvCms51erB0qAIgYugo1uYnlL/pS9mFfJEvidTuYzR3ddJKHW/Skeu6ue8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.8.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1211081},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry","path":"dist/index.js","limit":"11.5 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle","path":"dist/default/index.js","limit":"16 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.5.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","@stapel/attributes-react":"^0.3.1","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.8.0_1787889148151_0.054235166144906755","host":"s3://npm-registry-packages-npm-production"}},"0.8.1":{"name":"@stapel/listings-react","version":"0.8.1","license":"MIT","_id":"@stapel/listings-react@0.8.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"b26825af94af24a64fc8f5fa2d1b998876b33384","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.8.1.tgz","fileCount":231,"integrity":"sha512-Je5IEQ9Zy/AgyLitIW5brR78Ld7daew+v8s+LIuOXvxl4xfgrQOjqCaHSPe/UxcJDM/n9T/qp5Lhr4zcUFJAsQ==","signatures":[{"sig":"MEUCIQDOSmfJGT+T+S1nrxpD+u8YG2A7vUce38GZn4XMRa+X5gIgS2isPZP+SnadZ7KOr69ZvHZLHweXPaem8vXMnPwyf3o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.8.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1213896},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry","path":"dist/index.js","limit":"11.5 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle","path":"dist/default/index.js","limit":"16 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.6.0","@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","@stapel/attributes-react":"^0.3.1","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.1.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.8.1_1788044767803_0.8118868135730022","host":"s3://npm-registry-packages-npm-production"}},"0.9.0":{"name":"@stapel/listings-react","version":"0.9.0","license":"MIT","_id":"@stapel/listings-react@0.9.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"292482ed3f10fbc9cab8dddb7d7facd54c3c4674","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.9.0.tgz","fileCount":231,"integrity":"sha512-qhJlfFWF3pz7ooqTyfZ94Ps6cl+YkPDEUmEOaj9+Hvo8TyryK8ddfHYZNc3qMjG4+5bsyD8eh/dowKIUEOh9VQ==","signatures":[{"sig":"MEQCIBQgZEji20aiiOjT3MYWMYSCKIPa/llZSI1TubplY4S5AiAv6PnTBTHY/GqxDJ+VWP/9X15nN5gClFwgfg1AIE9f3g==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1229061},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry","path":"dist/index.js","limit":"11.5 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle. Raised 16 -> 17 KB for attributes-react 0.4.0: the composer's <FeatureFields> now carries the rule pre-pass, the form sections and the two vocabulary-backed editors, and the skin re-exports them (15.86 -> 16.02 KB measured)","path":"dist/default/index.js","limit":"17 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.6.0","@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","@stapel/attributes-react":"^0.4.0","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.4.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.9.0_1788124089803_0.2424787895635283","host":"s3://npm-registry-packages-npm-production"}},"0.9.1":{"name":"@stapel/listings-react","version":"0.9.1","license":"MIT","_id":"@stapel/listings-react@0.9.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"cb030572c0af93a480cf3269595e08f43f742b04","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.9.1.tgz","fileCount":231,"integrity":"sha512-WskORau1ai2cpYbUPrc+MHtaCXhfF1yhgRJg/J/j+be5Z+CRozPxe+w3s4OOeCjVXBiAy8Rlnpn4l8rzuCZtTg==","signatures":[{"sig":"MEUCIChIEn5dR1IqsSyR9HZHr+Z2lSjUGX8oo6EHEt0mFOFcAiEA6QawIMfAYvB7tuIlKnQOZ+eFuDfSAftRgr5unoUrTyY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.9.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1234915},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry","path":"dist/index.js","limit":"11.5 KB"},{"name":"default — the antd skin (card, detail, composer, dashboard, the four named slots and the delete confirmation) must stay out of the main bundle. Raised 16 -> 17 KB for attributes-react 0.4.0: the composer's <FeatureFields> now carries the rule pre-pass, the form sections and the two vocabulary-backed editors, and the skin re-exports them (15.86 -> 16.02 KB measured)","path":"dist/default/index.js","limit":"17 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"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-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.6.0","@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","@stapel/attributes-react":"^0.5.0","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.7.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.9.1_1788131760032_0.8350564113975845","host":"s3://npm-registry-packages-npm-production"}},"0.10.0":{"name":"@stapel/listings-react","version":"0.10.0","license":"MIT","_id":"@stapel/listings-react@0.10.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"ae316f7bbc83530ee0429afd59591e746134bce6","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.10.0.tgz","fileCount":251,"integrity":"sha512-tHdxARJVB+rs0fGve18B9tQTW/+A/GefY1RcPmSIOdDM/EENDW8bC7HmuJRnU1f94FEy3KA/mOJFPML4id7vnw==","signatures":[{"sig":"MEUCIBGOht+8O5ziVFAjbMvmihT8ufYWF49QnAN2hSXVOQsWAiEA+VkUrDmjicjkO9BD15X236QZ+BtjArd4NANj8Zsh/KM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.10.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1336806},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 11.5 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry","path":"dist/index.js","limit":"11.5 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.9.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.5.0","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.10.0_1788139068122_0.3976589810491271","host":"s3://npm-registry-packages-npm-production"}},"0.11.0":{"name":"@stapel/listings-react","version":"0.11.0","license":"MIT","_id":"@stapel/listings-react@0.11.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"a96f61ca7e2247d251eef60bffbc2768f4dd8274","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.11.0.tgz","fileCount":251,"integrity":"sha512-XbIftzGW4dlX9Mg4UME6z3B6T2lF3LcT850NZgSh5320ycf7RnZAnMduGi+zPG5wqLgKKb6z/y8KK3L+5IJPWQ==","signatures":[{"sig":"MEUCIA3Fwf/E2vRHRPRn6dREzGgm7gcC3kj8mHOjyzcw8vTFAiEAr1hfA3PVL1Pe0K3c6etUXPsQs9s0hIdFbvuZHpyifS8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.11.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1348875},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs","path":"dist/index.js","limit":"12 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.21.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.10.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.5.0","@stapel/currencies-react":"^0.2.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.11.0_1788159031389_0.28271815706747394","host":"s3://npm-registry-packages-npm-production"}},"0.12.0":{"name":"@stapel/listings-react","version":"0.12.0","license":"MIT","_id":"@stapel/listings-react@0.12.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"a4cb395f89187e6fb90031ec9e452338b5fd866b","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.12.0.tgz","fileCount":251,"integrity":"sha512-V/l3Ev3ZF7iazVcE4MXGdAE3XU8HPMVnvH+LYD8xuS7BMVN9n0JjH0/7sDFwdTZ9aLTU3J6pq2He3kfID1ootg==","signatures":[{"sig":"MEUCIHA0XAV2e9LkJFYx4FL8fVQAtGHx+krGGDF+/kyKZIP/AiEAyY4G5eknwahmJrvtRnqJ271lyuXGyTC4pFZ9SuazCNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.12.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1423074},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.22.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.11.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.6.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.12.0_1788169982070_0.0373247997534889","host":"s3://npm-registry-packages-npm-production"}},"0.13.0":{"name":"@stapel/listings-react","version":"0.13.0","license":"MIT","_id":"@stapel/listings-react@0.13.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"1fe02a8f6af972929713a324315e1741083728d0","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.13.0.tgz","fileCount":251,"integrity":"sha512-bkgYyUlybVChaMwD0ZkfReRIgNerc8oXEyFhNFSPT8NItrzKKjmRS9pY6SO1/BHftztG9imAmg4UKBSnzT4inA==","signatures":[{"sig":"MEUCIQCxA5NS3TpGr+xRi0WRjW5VNY/D6S4WlsJ0nbfgnSNBnQIgSRlb7/32C7/C1sJbssCrkwskn83kO8dpGeyh4EYq2Fs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.13.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1427331},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.22.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.11.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.7.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.13.0_1788179356976_0.4660890091694736","host":"s3://npm-registry-packages-npm-production"}},"0.14.0":{"name":"@stapel/listings-react","version":"0.14.0","license":"MIT","_id":"@stapel/listings-react@0.14.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"511040c3d6541b528094a6ff04c5963364869226","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.14.0.tgz","fileCount":251,"integrity":"sha512-cjpnyJQ/YSyz+BE1UUDQx3zC3nj20mEBxLXFSWAfztNU2Y7GBM2YrxCJdF07beqgSeniUYMGie5gGAtyhEwqXQ==","signatures":[{"sig":"MEUCIQDseMwca/iBqFV8N1LUxX6OBEvFBfRtTyIOFkXAfmEUTQIgTJYTAF70tRDNnueg84HmgJzHsIqcCdkYhJfT/JYnpSc=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.14.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1452952},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.22.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.11.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.8.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.14.0_1788186092704_0.6336368244696795","host":"s3://npm-registry-packages-npm-production"}},"0.14.1":{"name":"@stapel/listings-react","version":"0.14.1","license":"MIT","_id":"@stapel/listings-react@0.14.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"94ba887e65f0d595f5089e1eb9809a00ab44dd7f","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.14.1.tgz","fileCount":251,"integrity":"sha512-OmtNA2oOHQ5FBlMRX2/6O1E4l3178EtlQB0hxwdTLm7nlrl51HjjKZtjb4BneDdu0BWNkEbHnYeKrhA6LkvIiQ==","signatures":[{"sig":"MEUCICeLdjxI+K4g/2VQaCRVabYNoDX4wtn4gTQU861MEFUBAiEAzmBkIYrIsTKtXqhVDMIXRd6tBRDtqqJDlCs22HLVmAU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.14.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1454054},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.22.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.11.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.8.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.5.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.14.1_1788288770115_0.30661418927366735","host":"s3://npm-registry-packages-npm-production"}},"0.15.0":{"name":"@stapel/listings-react","version":"0.15.0","license":"MIT","_id":"@stapel/listings-react@0.15.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"c751d084f308336ed00ddd535f9d8dcb13609b94","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.15.0.tgz","fileCount":251,"integrity":"sha512-0gEvZ7rnesDGd8jTlxp36PM1QTd9QT04oRtSUSGL7YkLORQJpsOdfJj05m6RxinYgVs6+OBYIiohZfWQiGbDuw==","signatures":[{"sig":"MEQCIGTxQ7m/AJz97JTPPiedo4lVuHilYArSPJy0ycquV8qMAiAVgGD4Lp7PYwDcet91jE9UBMzbGZxfcMDAJYTpXNsVKw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.15.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1493271},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.12.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.10.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.15.0_1788328738811_0.6970324713236455","host":"s3://npm-registry-packages-npm-production"}},"0.15.1":{"name":"@stapel/listings-react","version":"0.15.1","license":"MIT","_id":"@stapel/listings-react@0.15.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"73fa3e5b8bc97ad51cfeba82fb250a3cbee363f1","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.15.1.tgz","fileCount":251,"integrity":"sha512-085gUqnjGfTa7ZbWEki2F9qE4TZc19P3uqrMmOKfv8AmQDZ7K+JvQ/jdMbyg00FoRxNSzlmVSp5fJHnhI/bFLQ==","signatures":[{"sig":"MEUCIDPiCVZjla9YZKU/RHwaswnNQuNmbMlAxO74R/nZHN9LAiEA8S/zy8UAsYHyfva7mxBq5mvc7uoW6rvCIFs/00XM/3I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.15.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1496255},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one","path":"dist/default/index.js","limit":"19 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.6.0","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.13.0","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.11.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.9.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.15.1_1788340884661_0.36354863894094835","host":"s3://npm-registry-packages-npm-production"}},"0.17.0":{"name":"@stapel/listings-react","version":"0.17.0","license":"MIT","_id":"@stapel/listings-react@0.17.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"115ca781fa3b48f99e188ad9260f67a1af945720","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.17.0.tgz","fileCount":256,"integrity":"sha512-WmiGk7UL1LWiId8WKFcGcHK4/k+/o/6lH0MFUTIxc7ZVLF2YC159QZVbbImOVu/as3tPzSJvsaKBCiNtAmDR+Q==","signatures":[{"sig":"MEUCIDDBIJaZG9ceWXAu05jEMxxIXydbxyWb3UDH0G1txuKcAiEAgwLqRUgg7LuK/N6yevy0lv4zJDozdLZEyi54YuNjOPY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.17.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1552001},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets","path":"dist/default/index.js","limit":"20 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.11.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.11.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.17.0_1788364616865_0.9330098697219977","host":"s3://npm-registry-packages-npm-production"}},"0.18.0":{"name":"@stapel/listings-react","version":"0.18.0","license":"MIT","_id":"@stapel/listings-react@0.18.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"2bb45b938d0ca88e5306d46c31c141f24683124f","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.18.0.tgz","fileCount":256,"integrity":"sha512-naIQinoxLnee9RFl4EZAOE5GWp374uNLUykN7tiv2Hn+ftyaZ4BkMymJGfJHqMRxD6Lp1r/DjwnktkkV59LTEg==","signatures":[{"sig":"MEYCIQDxBpHjw7+p/hR+vJf5bUsqFULxs4q/Rl6Z29iAZTFx2AIhAPgmcLiPdoLU+HHZHnRQnwZSf6/7lZloIVazax6xBvnt","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.18.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1554167},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets","path":"dist/default/index.js","limit":"20 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.12.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.18.0_1788374576110_0.42438097197125346","host":"s3://npm-registry-packages-npm-production"}},"0.18.1":{"name":"@stapel/listings-react","version":"0.18.1","license":"MIT","_id":"@stapel/listings-react@0.18.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"a796e71db5688dc38cc5714320405bd39ba83672","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.18.1.tgz","fileCount":256,"integrity":"sha512-aHloCXCPn8gVPR1zEfUZ7gHo80UaiN+En4z8/ZISZoPJwD5hC2UX3KdnxALReBwxnMuzCKgrHTriNCIEPVKlwA==","signatures":[{"sig":"MEUCIQCbsZV9EGnZkRgNRAb/sv2tSY95tFSMJqndNPiB0q/9bAIgJgkSUlQD4UdBWonSONFtePDgTzffhHTz3gEXSnsBKSk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.18.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1556744},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets","path":"dist/default/index.js","limit":"20 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.12.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.18.1_1788380643965_0.7696214652895845","host":"s3://npm-registry-packages-npm-production"}},"0.18.2":{"name":"@stapel/listings-react","version":"0.18.2","license":"MIT","_id":"@stapel/listings-react@0.18.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5f36317035c8b19cd041643e8eba7f362747249d","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.18.2.tgz","fileCount":256,"integrity":"sha512-rGlgqsJt5ias+ZV7T3Tuvww/aZgAe+KuO2JHpyHMmprqMLpxn8Yu+/lKcZZaXj+X+XZhxB7pGvomlMMm55yYVA==","signatures":[{"sig":"MEUCIBH7k/sLbBIWVAVHYbtiKFNUTLy3LGebn0i2DDpQleDQAiEA4MWWbS0tK56ey9RkYCffNWG4vmgviQp/mgKOiSt1H/I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.18.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1565088},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers","path":"dist/index.js","limit":"13 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets","path":"dist/default/index.js","limit":"20 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.12.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.18.2_1788383045602_0.4937387328543372","host":"s3://npm-registry-packages-npm-production"}},"0.19.0":{"name":"@stapel/listings-react","version":"0.19.0","license":"MIT","_id":"@stapel/listings-react@0.19.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"6c6ecbe732e3d75f68853996e659f0b04f97189f","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.19.0.tgz","fileCount":266,"integrity":"sha512-ys49gkqbOZgue8ujauh3s0StCXhHkRUBKvlhpL/VVAXsI1uYB2GBf6t5xXOia4xMdMccjI2sqYQxaJF99F+V7g==","signatures":[{"sig":"MEUCIQCQOhI3N30yag6E6pHeOCyBqZ2dmtiQnX0TWeW0e3txYgIgMDLhgcOvZcaph0TuFle4YeusF7ZEvZDIHuHwFzyMD48=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.19.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1701592},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs","path":"dist/default/index.js","limit":"21 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.13.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.19.0_1788396815335_0.4996004255688298","host":"s3://npm-registry-packages-npm-production"}},"0.20.0":{"name":"@stapel/listings-react","version":"0.20.0","license":"MIT","_id":"@stapel/listings-react@0.20.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"18e49556bb022f599550ed97a968d6e134412467","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.20.0.tgz","fileCount":266,"integrity":"sha512-2chF1kJrVeIn/GvEuNMqyGL0hvaBQh5ELugn6kTN8BdL3xfKRpEL/5+XV4e3DlLxHtqva6sMG14W1nMV5HB3/g==","signatures":[{"sig":"MEYCIQDyLXglt6sH55CpgF7L6aZnhNd1utvUGKFfwMEXIGTJ5wIhAIBrNkyZ6wVz32XdNRTpYMs4J8jpYVXOP9h3e4iLJNrU","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.20.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1712530},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs","path":"dist/default/index.js","limit":"21 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.14.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.20.0_1788407688188_0.02297389857850396","host":"s3://npm-registry-packages-npm-production"}},"0.21.0":{"name":"@stapel/listings-react","version":"0.21.0","license":"MIT","_id":"@stapel/listings-react@0.21.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"05778b625b0078e29ed1213a628d8baf92c10d79","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.21.0.tgz","fileCount":266,"integrity":"sha512-gc1tQXpWP48z9hdk+x/+F8aGcXZveM+F5K01qwsuTt/9H+JaSldNhrdKMD20SBrcNQn1kXasR9ghRMOPVlHHNg==","signatures":[{"sig":"MEQCIGlln8szOCCL4doxK9grLqIkC0Tn1zJ7MiL7Oa+petaOAiAJ9UBYK1oFXwSiJckQT1+6OAdZIPD9ZMh6LcGcE77aQA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.21.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1728993},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs","path":"dist/default/index.js","limit":"21 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.14.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.21.0_1788423725818_0.992862090987535","host":"s3://npm-registry-packages-npm-production"}},"0.22.0":{"name":"@stapel/listings-react","version":"0.22.0","license":"MIT","_id":"@stapel/listings-react@0.22.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"d7720475e07ce57ce6b0e8b5c3942369de707dfd","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.22.0.tgz","fileCount":266,"integrity":"sha512-D3M2sVkxkVpsHS3Yt/bq8WpwPeSJDq4VCRAxGPQOp6iqQjQGbo08f2bSHqtkItUXPITEow4apM/jdbCRJkPZ8A==","signatures":[{"sig":"MEUCIQCyo19Oo9vz905YOH6Jile9c6UHiGKUi/9L/rw5kcIY4AIgCa+68rmSJXXEQbixshoGZmDfNAAogFftLzVmWjfpJQo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.22.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1825377},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error","path":"dist/default/index.js","limit":"22 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.14.1","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.22.0_1788439330243_0.27642968607609597","host":"s3://npm-registry-packages-npm-production"}},"0.22.1":{"name":"@stapel/listings-react","version":"0.22.1","license":"MIT","_id":"@stapel/listings-react@0.22.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"8db808a17dc0b5453c340ba600e08ead3c268672","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.22.1.tgz","fileCount":266,"integrity":"sha512-5YyecLh+Es7tewar/FA++dOEIozM/qaHaGd+sJTNNtMFGsK6kozJpGKuuUomwg/ho3yXfo8zBFrYP1JKhiARZg==","signatures":[{"sig":"MEYCIQDMAFNHqUPSaK3G1V4Mf/EqLizKDkKYYh70I+vRiNMH6AIhAOTozoDBvEOIG0Xbu+sVfxJJNpeP0ePD77K2e3RlLTXq","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.22.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1828104},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error","path":"dist/default/index.js","limit":"22 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.15.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.22.1_1788507331671_0.519402065640773","host":"s3://npm-registry-packages-npm-production"}},"0.23.0":{"name":"@stapel/listings-react","version":"0.23.0","license":"MIT","_id":"@stapel/listings-react@0.23.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"322c91c38b65d881ee641ff5b310b2b076b5b3d4","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.23.0.tgz","fileCount":266,"integrity":"sha512-axqcWGMVYr1GN2heTWMcxD7Ni4ddeeoIpPbk9KtRaoi0t3HrvVb/YzW276WKDt18rqpVj3X6KZuBd9Uc0AmrUA==","signatures":[{"sig":"MEUCIDyw5f8yDMwSsRsRm1TbXB7/sQ8Np+vLQgRCd13pg9mAAiEA0xoAJ3m2IPgd9HCszXcZR8xCpX1g/f5Y+hu+RWpAlEM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.23.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1845596},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding","path":"dist/index.js","limit":"14 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error","path":"dist/default/index.js","limit":"22 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.15.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.23.0_1788512462842_0.770904690516347","host":"s3://npm-registry-packages-npm-production"}},"0.24.0":{"name":"@stapel/listings-react","version":"0.24.0","license":"MIT","_id":"@stapel/listings-react@0.24.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"339b51095e6b81ab187dee380efe259569085c6c","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.24.0.tgz","fileCount":291,"integrity":"sha512-/KXyfcVxBOqlnMqDhvivWof2EUVHcPnX+2pEJvpKrvXV2HBKo9cIPDlkzLxm6TRH+uYRvT29f356jnmZtT7bJw==","signatures":[{"sig":"MEYCIQCWSTM0Ou3X+9YQBje7cLmN60Z3qXb1SlRUFeuYn6IgpAIhALI2xgfcWdnfzPUtPp7GK7hyNUfhXdkcnWmS6CTRfwZf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.24.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2003756},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.15.0","@stapel/currencies-react":"^0.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.24.0_1788516746889_0.693177130609653","host":"s3://npm-registry-packages-npm-production"}},"0.25.0":{"name":"@stapel/listings-react","version":"0.25.0","license":"MIT","_id":"@stapel/listings-react@0.25.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"18834afbd84345804886d86d3d5dac9f12449530","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.0.tgz","fileCount":291,"integrity":"sha512-lb6FdiwCSecDqr9CXHomlJ8i6u7tQgXEzam1krS5WbXNCmUgkwIL2JYHBXI8n+725rH0Frc/dRuuf8ZIsLr7NA==","signatures":[{"sig":"MEYCIQDX2rmACtLybmREH0/b5YbVRQIYN9SLfzFHRY5nE6ZKdwIhAIExDOi3kBvYf5Day0TyrqASvJA8OGQsCkDe2vxVoP1D","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2019948},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.16.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.0_1788527914029_0.8928459285399293","host":"s3://npm-registry-packages-npm-production"}},"0.25.1":{"name":"@stapel/listings-react","version":"0.25.1","license":"MIT","_id":"@stapel/listings-react@0.25.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"d01068ac0828d1642029fe616e369ca8ece438b8","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.1.tgz","fileCount":291,"integrity":"sha512-WRmnTisTTyqIwV9as4og4XCSWgLXUyrEPyCyKBba+wb4P8f6UEejovf/Q74XxOjSvA3VoDIplY7Q3MM4EancOw==","signatures":[{"sig":"MEUCIDRhooLZl3zmdluFV40MXijLkIj7nLtVI+GIRU1zSkcgAiEA5A2KsyS3skmx9bDLe7tCHma54i45RHEUCHFneQpCUM8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2020381},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.7.0","@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","@stapel/attributes-react":"^0.16.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.1_1788603383354_0.7448549370530939","host":"s3://npm-registry-packages-npm-production"}},"0.25.2":{"name":"@stapel/listings-react","version":"0.25.2","license":"MIT","_id":"@stapel/listings-react@0.25.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"d94f0d053d53a7bcc9ea37757d3288eb7f42101d","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.2.tgz","fileCount":296,"integrity":"sha512-FTwngje7k+etElbO96YVmZK9cQjI8I09PQX6RcEZchBX3xtt3UgfIPH4h0l6cdBKDonvMUp/7ugpo5bnJAbteg==","signatures":[{"sig":"MEUCIC8HsZQ/95utk55ciDJQC/kIe232XbKVHmf5iO0UkSQ1AiEA20p7nHkz9TksxtK9e5pSK1I5F719kEhpSmeuhRTyGP0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2049497},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.1","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.2_1788618056789_0.024139587837627374","host":"s3://npm-registry-packages-npm-production"}},"0.25.3":{"name":"@stapel/listings-react","version":"0.25.3","license":"MIT","_id":"@stapel/listings-react@0.25.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"f6fae7fffc62e137151cd4b28f4ca3825d544a4a","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.3.tgz","fileCount":296,"integrity":"sha512-o2caJUski7YMBdmJLEmerOQoxs5R27eHlzb0e+8d6UkMFK0lGkRQv+hpx+b29ffS2s9dTxYNKzzQqiyVgrDjQw==","signatures":[{"sig":"MEQCIBg3Q/68o4JTLx5JS9y3efVz2SAHQTWado0z9tHaNppwAiA5AqtaK1yH859t1LOcAo0eAeXD/XhEZ5twTRgEUhmaqg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2055424},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.1","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.3_1788626513217_0.6867543461834882","host":"s3://npm-registry-packages-npm-production"}},"0.25.4":{"name":"@stapel/listings-react","version":"0.25.4","license":"MIT","_id":"@stapel/listings-react@0.25.4","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"57ca214eff9ef33ca47b6f711086a38604e74430","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.4.tgz","fileCount":296,"integrity":"sha512-oANfCx3uQaEts4RZww/dbHiOiLq/8YPi9hfKBZL6eE3xZD4s5UvL1YeFfgc2I43dltJt6/tLDk2PeMgcqHpyMw==","signatures":[{"sig":"MEYCIQD4Kuv8Tex370j39h6/Mk4dpRQzcFeF0LYFbLbTSkws7wIhANVeShRmXsWNeTlGTWCVx03Lbo52h6Ss9Gif970fBT1P","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2057466},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.1","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.4_1788631808293_0.5286676074988053","host":"s3://npm-registry-packages-npm-production"}},"0.25.5":{"name":"@stapel/listings-react","version":"0.25.5","license":"MIT","_id":"@stapel/listings-react@0.25.5","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"05b2e5780e9c76e2ff265764a16f70413187a673","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.5.tgz","fileCount":296,"integrity":"sha512-FfPw+GkE+Ko4WR2uudOuYlPE7ATAUpt4rhL+fdpLpj0Ip5/fBX4SCnHp5WGm3HaxIAQ8G8YRykOSKoftsjIP0Q==","signatures":[{"sig":"MEUCIQDL6fWpX4r0TEHC44yKq+MYtyTHRsX5OgzItr9Mk2q5dgIgNpnlhQ0dERkmwIhRGF1q+eSZ9cunmB6kjr3GN36uew8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2064254},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.1","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.5_1788634806355_0.7965678900197803","host":"s3://npm-registry-packages-npm-production"}},"0.25.6":{"name":"@stapel/listings-react","version":"0.25.6","license":"MIT","_id":"@stapel/listings-react@0.25.6","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5b44835e9416f8ff3ae25b8bd56e06250d6e0701","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.6.tgz","fileCount":296,"integrity":"sha512-3MbMTEwVaxv0acNbHzCFm6Me2ig6TZ+NYulVZePlBfOE+O4M3jv2IJUIikv+7AquQdDSqySHX0Rse0H7M3GM9g==","signatures":[{"sig":"MEYCIQDrDaSWGtG6cfPV7eSeJWIJqglybziLO+fgg96neSODXgIhANe1jqFyDeFvCsHsOl8YE35AmkzyOjuOEQj9vM7gnfLZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2073965},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.2","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.6_1788637674795_0.4556403060603238","host":"s3://npm-registry-packages-npm-production"}},"0.25.7":{"name":"@stapel/listings-react","version":"0.25.7","license":"MIT","_id":"@stapel/listings-react@0.25.7","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"cf15809d7c9dfddd915bf22e05b91ebf2181b3fb","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.7.tgz","fileCount":296,"integrity":"sha512-JHKROs5Jx0vD2ecve/b8p9pi9ZTiV3/wpznFBryHVLHxaGbU0LVpEvE92PBVuUztZolWTCye7gZlxkmNrOrLnw==","signatures":[{"sig":"MEUCIF5zVGL8nGPHoIEjlTtDcMXAP5+eTPvj6IYHVTXg4u2MAiEAx/zQWCXC1hXZlmEwqsoAsaSksrT7+0VKCWAffTk1IMM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2083758},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.2","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.7_1788648650915_0.8629113340688181","host":"s3://npm-registry-packages-npm-production"}},"0.25.8":{"name":"@stapel/listings-react","version":"0.25.8","license":"MIT","_id":"@stapel/listings-react@0.25.8","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"04eb87f899ad3d95c181eafa6b456318979a30fb","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.8.tgz","fileCount":296,"integrity":"sha512-NyycB1LqLqVPlzRI18m7HddFRDOTS8hEjtunR/EWB3HW3u4lfqU315+Pij1Hgdcyj+hY+1Vf9R/hHalhEt2jOQ==","signatures":[{"sig":"MEUCIQCHr82r32FmJp++cVDWUH28JMKZEOq7KFU23O6oemuZWQIgV9YZqqRh3j83NPT9UInZ6Awa11z0VdC7Q8b6fu6aTIw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.8","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2079698},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.3","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.8_1788653791167_0.27285967305717107","host":"s3://npm-registry-packages-npm-production"}},"0.25.9":{"name":"@stapel/listings-react","version":"0.25.9","license":"MIT","_id":"@stapel/listings-react@0.25.9","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"814aa91aceba685d143563f96e58d831e9e387f9","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.9.tgz","fileCount":296,"integrity":"sha512-enh5EgxfXgvTzv+wASpTfwCe29fVblSORtffBn3/CX9+WmTaxlQDfOrBrRupgkaogKj3m+QhAaimXdGtHkpQDg==","signatures":[{"sig":"MEUCIQDNe7xrxRBVXZG7iHviG53pL5KsrgX5N0wAi3mSxEFiuQIgGsB+P6nbJNJGAMMFoEg2JRJhpYNX9UWlPXu90AK3Uuk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.9","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2082356},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.4","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.10.0","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.9_1788659945894_0.3963842408305389","host":"s3://npm-registry-packages-npm-production"}},"0.25.10":{"name":"@stapel/listings-react","version":"0.25.10","license":"MIT","_id":"@stapel/listings-react@0.25.10","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"4d54f9bbf1d7069a891d3ccbe3c3a3c86aaae345","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.25.10.tgz","fileCount":296,"integrity":"sha512-f1aQIMaOXiCtosRrYGUgru5MMwckjBAYTTAeUr3xLHsd6IG9jfKSmJxR8jlVHziciy1ne58YmQfIGkyET271vA==","signatures":[{"sig":"MEUCIQC2sHg4iM96h2qYzM7u4MYGdON5DC71rTOo5b2N4FOd1wIgTXiPvRrziAseAS7i0k8/HUdYpxEQn8sQ9/bXdhTiEt8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.25.10","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2089683},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit.","path":"dist/index.js","limit":"15 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error.","path":"dist/default/index.js","limit":"25 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry","path":"dist/i18n/ru.js","limit":"5 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one","path":"dist/i18n/es.js","limit":"4 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.4","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.25.10_1788665593991_0.9645710922058335","host":"s3://npm-registry-packages-npm-production"}},"0.26.0":{"name":"@stapel/listings-react","version":"0.26.0","license":"MIT","_id":"@stapel/listings-react@0.26.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"adb63f274955d95b4813cbd1905d6441073be853","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.26.0.tgz","fileCount":321,"integrity":"sha512-1DXxOlosRKKjKb0S4ByZKTr5nlQNUpk65UY7uhjkomdyHX4FT+vRU0N/iaDnviM9rpCOmd3VFLg5KhIJa15NFQ==","signatures":[{"sig":"MEUCIQDJD/fmfdlhKXoDLYDOaS3ANzUycpWMXzPq8BPjGmIifwIgRuvsfhAN1Ht6ANaF5+Qio3qVJmAyrKZBMaZT5HVTBE4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.26.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2331233},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error.","path":"dist/default/index.js","limit":"29 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: the module is locale-exempt upstream, so a code that arrives without a ru sentence renders its own key on a Russian host, and each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.5","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.26.0_1788683218047_0.4266305303927109","host":"s3://npm-registry-packages-npm-production"}},"0.27.0":{"name":"@stapel/listings-react","version":"0.27.0","license":"MIT","_id":"@stapel/listings-react@0.27.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"da4ffc2899f43bd5c96dd25696ba0cd9a3dfc4f5","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.27.0.tgz","fileCount":331,"integrity":"sha512-2Qf25anGT7tKLno2NsbeEcBZq5v0jPtY4aKd2Qz+6Xr6NbT+qDfkfQcJS8NCzdXqBbj0e91i6+Y7WLNjj73x0w==","signatures":[{"sig":"MEUCIQDoC7OjMW00rjCdON4fEfwrTFsbA9/ds6Lqo/i7wMKb8gIgCT1/EDSEPlv16C8T1CQ8LBXStYBiQ/5YOigKjLp0mSE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.27.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2404968},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry.","path":"dist/default/index.js","limit":"31 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: the module is locale-exempt upstream, so a code that arrives without a ru sentence renders its own key on a Russian host, and each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.5","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.27.0_1788692454734_0.010221181693945036","host":"s3://npm-registry-packages-npm-production"}},"0.28.0":{"name":"@stapel/listings-react","version":"0.28.0","license":"MIT","_id":"@stapel/listings-react@0.28.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"dad95df4199c2ff4df469a708f4dd8fed9fe0319","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.28.0.tgz","fileCount":331,"integrity":"sha512-nxJETy/E8O97HxwWtvGGrkRYLOht1UX+lZ95uKIiiU3IIV9MRdPmcI0qCN59pL4M3AP7ZJ9JlbeErwdRErmYEA==","signatures":[{"sig":"MEUCIQCByi65yOF97vSrTxsZHuilJX7rxK367ypkSTG+l9jMdAIgUvREkokToWoxGWGtZT4Ar8oKRXbHyi61yYKpOypBDNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.28.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2453548},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry.","path":"dist/default/index.js","limit":"31 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: the module is locale-exempt upstream, so a code that arrives without a ru sentence renders its own key on a Russian host, and each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.5","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.28.0_1788696202365_0.27835767842913506","host":"s3://npm-registry-packages-npm-production"}},"0.28.1":{"name":"@stapel/listings-react","version":"0.28.1","license":"MIT","_id":"@stapel/listings-react@0.28.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"7022285d2d57235ca6d18ddc703690b34835b110","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.28.1.tgz","fileCount":331,"integrity":"sha512-mIdlB02ghblJaDkJSeSIrwcF1PGtSU805567mYzewaJBQtPg0binC3tx04tqE/mIVZn0fFxReGFZ7ABX9TR9kA==","signatures":[{"sig":"MEUCIC8R9KXncPOB7aw6FyJcgZLi2rhR/8FnFlrWHD6z29bSAiEA0B9zbx+/OM/jXaERHOayESZ6+rk1dvA7sC2dtE8ASWA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.28.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2461998},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry.","path":"dist/default/index.js","limit":"31 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: the module is locale-exempt upstream, so a code that arrives without a ru sentence renders its own key on a Russian host, and each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.5","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.28.1_1788704161469_0.3406230474898766","host":"s3://npm-registry-packages-npm-production"}},"0.29.0":{"name":"@stapel/listings-react","version":"0.29.0","license":"MIT","_id":"@stapel/listings-react@0.29.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"01bc678c898a9aea323eb43684bf4d36dc924957","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.29.0.tgz","fileCount":331,"integrity":"sha512-h5PDTpRtYrNNA7D6ACUIDnF9aDwUrGUCo+xliuyBXXwmdQSNg1vIqAOSQPXxxwZUQCWfEQpi3U17yVohXgKLKQ==","signatures":[{"sig":"MEUCIQDJcykfo/2Lvl9MwUevX1Q9g4bkMyEADaY1jUtk7Vfo0AIgNhe7BzGjbsbTy9TqeX9DSqLYMeCSQh79n2VnZ3pYfZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.29.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2469637},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry.","path":"dist/default/index.js","limit":"31 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.16.6","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.29.0_1788858529794_0.5113094906805464","host":"s3://npm-registry-packages-npm-production"}},"0.29.1":{"name":"@stapel/listings-react","version":"0.29.1","license":"MIT","_id":"@stapel/listings-react@0.29.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"d58f9b26388811d2d7ea88213762f982144e3af2","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.29.1.tgz","fileCount":331,"integrity":"sha512-NRG+VyNdwF8JNe5rmx+YzA3J2sHQwM9vZVQVKA7juivR4Q2PSdnDprfis8mIWL8JNBc1m0/KIoMU8NPUbctmyQ==","signatures":[{"sig":"MEUCIQCIQgXscSY5mu+7xtp34ZQ37amKpfl5WygKfi2jy8BH/AIgc0moUlwMi6DlyYs9c2w1vFn6DTCASldrws4NHcaEMPQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.29.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2469855},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry.","path":"dist/default/index.js","limit":"31 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/image":"^0.4.2","@stapel/tokens":"^0.8.0","@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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.29.1_1788862352628_0.5216940203844875","host":"s3://npm-registry-packages-npm-production"}},"0.30.0":{"name":"@stapel/listings-react","version":"0.30.0","license":"MIT","_id":"@stapel/listings-react@0.30.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"3b17c44a467c376f07ae1c7511edb8c7def82e5d","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.0.tgz","fileCount":346,"integrity":"sha512-hSI+OCasQpJ2w/YLe8lzEDvVw+NBpc+rvMnknl852zIdHIAVm+18kaBifwQzvxyLMqI9ooeqs3TWO7tZle9x/A==","signatures":[{"sig":"MEUCIQC6SAedTerrKdJhFSHwZjmSeYBLtxWI2pPZFK5dXmdEGgIgL1W65j1+Yldz146cavZcSio3Ih294MPBUQ1r5ZMbEsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2608131},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.0_1789090766450_0.5577527796424084","host":"s3://npm-registry-packages-npm-production"}},"0.30.1":{"name":"@stapel/listings-react","version":"0.30.1","license":"MIT","_id":"@stapel/listings-react@0.30.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"e001533c20a2b1e4db621e5195bd7109cbad6b52","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.1.tgz","fileCount":346,"integrity":"sha512-HBufrPolyamNnEatJVrk4j5743SI6IpDb52+5WyDlMEpbAIIZ4gMG3PBVVAs/APIsNXDcrx40S3kPGr4ch/2/w==","signatures":[{"sig":"MEUCIQDWiBpkVJWoYj6IskdRQrkNaSrbsg/4TikDLyOmSPh5hwIgGsUfymF/pIPbgzbsrw4ldhCzdnGb9KGqrwHdx0RzTHo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2615326},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.1_1789166960062_0.258817596093295","host":"s3://npm-registry-packages-npm-production"}},"0.30.2":{"name":"@stapel/listings-react","version":"0.30.2","license":"MIT","_id":"@stapel/listings-react@0.30.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"660d3c4ded00b0ce708e4e0b86ab0759b87ba950","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.2.tgz","fileCount":346,"integrity":"sha512-KjmfQ3pMPsxFAuiINzBFoJMFsRwLwLmANT7gkklI2iczRDCmgamUmv1kxwNHDiPeXOSj5ZgxwV/n2Hzz+rMltA==","signatures":[{"sig":"MEQCIA0WGIOTFPNwb/X04CRUiYFSnVuTjLkVnDYKvbn4fLARAiB3dfPImXP4hou0a2mFh6EWdb4lNCGBfBn3YHeGke1tUw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2628838},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.2_1789173127739_0.35325414129377264","host":"s3://npm-registry-packages-npm-production"}},"0.30.3":{"name":"@stapel/listings-react","version":"0.30.3","license":"MIT","_id":"@stapel/listings-react@0.30.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"5c80628e24ad057a8f87408f2bb16e4b62525b12","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.3.tgz","fileCount":346,"integrity":"sha512-o49TVJT2UzmzNgpDXs0I2o4Z6gQs7vBjs9kzQaRUCDza5HIKCspgTfj3YdbxmcTR9lA5rVF41PdGvlfVfRhddQ==","signatures":[{"sig":"MEUCIESmPxKhXWTi5KYZ9Wvevt5gh4UBu/fsDLhSDgU1fg91AiEA4eeNBE2V4XnmA0MHNeNf2Tviy5ZVq5r5ZbgAp1tsy1g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2656726},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.3_1789258317601_0.7235366650850679","host":"s3://npm-registry-packages-npm-production"}},"0.30.4":{"name":"@stapel/listings-react","version":"0.30.4","license":"MIT","_id":"@stapel/listings-react@0.30.4","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"43177860877005a4fe441b5c62c590e1d538d646","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.4.tgz","fileCount":351,"integrity":"sha512-TFMiX3ImZmqO3ofpZnWKpYCvnTvrUue/E1UYBJUfoCvK7ByzQZFQaZldbpKeSwSuO2YzilX0SkYixIjwhh/Hmg==","signatures":[{"sig":"MEYCIQCEJkdXXzZslzI37rPZEesmlUW9DxvAS5tOQrOquzBd7AIhAJVulba7yF+kmLzbmGaQH2nGte9koKZwF8X5xuqjszoC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.4","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2668658},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.4_1789260971659_0.9368833605332507","host":"s3://npm-registry-packages-npm-production"}},"0.30.5":{"name":"@stapel/listings-react","version":"0.30.5","license":"MIT","_id":"@stapel/listings-react@0.30.5","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"69f83c0abc6ed432c267c7d1da39e8f6234101a4","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.5.tgz","fileCount":351,"integrity":"sha512-b1BNvNuzD/91vPZ/bLdZQMI1XiNfFytJJxj1UBDuLQ1Cs5VX/h34l5g/MNw5hBnVMNxNBnWx2Gkd4CUk8B5IEg==","signatures":[{"sig":"MEQCIENqy6hjyiFddwGVFK61I8SeF9a184EvnNb4fTX3u/B8AiAsj4gHBuWzmAU8VzihxXdu7HjVtpXSbg4qySSpbATbTA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2670771},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.5_1789263549334_0.13009859866590512","host":"s3://npm-registry-packages-npm-production"}},"0.30.6":{"name":"@stapel/listings-react","version":"0.30.6","license":"MIT","_id":"@stapel/listings-react@0.30.6","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"623585146a08958028e52ea6d3f5c8bbad3655c6","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.30.6.tgz","fileCount":351,"integrity":"sha512-khGfoonIYHohNDOpvgN6pv6Qa5n3GFD19sdr84rxROhwRS+Dzs6smLqOgKQiUw4MWmjYOUeRsg8Vw6TYAolxwg==","signatures":[{"sig":"MEQCIEdv3Dzfr/nJCD+5SUdYFtqAT9+UfwCsgBqqsKG53MDxAiB3cT45X1PsbrNT77Xdr44te++r5ssZCUGBFWkDyBD8Tw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.30.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2675767},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.30.6_1789265649197_0.5227467103868122","host":"s3://npm-registry-packages-npm-production"}},"0.32.0":{"name":"@stapel/listings-react","version":"0.32.0","license":"MIT","_id":"@stapel/listings-react@0.32.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"9cd3885a6f612ccd6ac90358a09e9d6d28ff4914","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.32.0.tgz","fileCount":351,"integrity":"sha512-FHbmJB3O4SjQIbaBaHxvch1c+u10m9vz3aX0LziohZSBjeff2jAO4Rm6Q/nlKpzkvssVSUNIZbYevytY0bSoSw==","signatures":[{"sig":"MEUCIG31SNqwFko3NPlRzJLCZARImFQ9fvPSu/KoE17FB+ajAiEAsKD2Dnma/3aSHUvStmoZysd30yIWNTcT8I61r5ZbUco=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.32.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2684478},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar.","path":"dist/index.js","limit":"17 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB.","path":"dist/default/index.js","limit":"33 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes","path":"dist/i18n/es.js","limit":"4.5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.32.0_1789276761241_0.655216862011212","host":"s3://npm-registry-packages-npm-production"}},"0.33.0":{"name":"@stapel/listings-react","version":"0.33.0","license":"MIT","_id":"@stapel/listings-react@0.33.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"6803fa207b45d158984a9e1863d1e05189f38b32","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.33.0.tgz","fileCount":356,"integrity":"sha512-TrdZUARm0qsO16MwJcV5sJDXgYC/5xp2QL+0RJ14J1gTRKYVhfuovPj1uaE1E61vHRGxyIDSy+ZZo0JbY0MxAw==","signatures":[{"sig":"MEQCID2Q+rxqhlSy1RL3tSWi0wtKDfjP5wjI4LuIDOt9UNf7AiAvKFM1RdDqRHv2R39xbFfOA6nsxeQfONizrjkyKmvuSw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.33.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2767367},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.18.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.33.0_1789300743079_0.9975432786613727","host":"s3://npm-registry-packages-npm-production"}},"0.33.1":{"name":"@stapel/listings-react","version":"0.33.1","license":"MIT","_id":"@stapel/listings-react@0.33.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"efdef7b1a30c934a8ff540ef6aa361234f6d7b2e","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.33.1.tgz","fileCount":356,"integrity":"sha512-AApEv+0B54B7aBrCPTqou8ddbG0pohWZ5NK86yBcyimUGpV1ceOPGwgF4IJDY7w18520b6HWjvyqrv5B0Ero9A==","signatures":[{"sig":"MEUCIQDBiUdTIa5qLvR2pDTslOIWwsFCS+Q5gZAkHFGIJJ+3EgIgNl/VDCoBFVo5osfuMI/y3V27xUss/7WUjX/1qV+xCaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.33.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2782682},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.33.1_1789317018029_0.2213581492873229","host":"s3://npm-registry-packages-npm-production"}},"0.34.0":{"name":"@stapel/listings-react","version":"0.34.0","license":"MIT","_id":"@stapel/listings-react@0.34.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"854b86777f22d66eeb79726db3c8d973c0ccb8ed","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.34.0.tgz","fileCount":361,"integrity":"sha512-Ku6vURLPfmyfN+ItafUEtAYrKp1ZQhsLEz1sUaASzWyQBOm93ATEKo7i0ea3AKkI9DJn5zkL7QoXNiCkhxwZeA==","signatures":[{"sig":"MEUCIQDi4/0u1LPTe8FM8ps75e2nd1rXnW+43ofs4VzmH3qyLgIgFsWRAG/CiK+Hzazy2rCS8MyBbE/uaP2VdA7K1JxlKf8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.34.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2807548},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.34.0_1789324168110_0.25241578512592056","host":"s3://npm-registry-packages-npm-production"}},"0.35.0":{"name":"@stapel/listings-react","version":"0.35.0","license":"MIT","_id":"@stapel/listings-react@0.35.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"54572e398e4f6486d115faa53528ae230bdb542e","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.35.0.tgz","fileCount":361,"integrity":"sha512-VHlqcP2Fuoq6y4G1ztBliFCpoZuhbnzmg95auNYtSOlqkxZ3O2vnkZwZkKRX4WDCuDw6j/couxYoz9UAap7fJw==","signatures":[{"sig":"MEQCIFkTFEWMo9yXpj1dM0+vu5odYKloRmuYwrif0uh0G3eQAiBISxQEo+N1RJGUo/fHy9JVG5x94PwKs4UnnnXKWqGeiQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.35.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2851897},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/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","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.35.0_1789332410455_0.3290761136125746","host":"s3://npm-registry-packages-npm-production"}},"0.36.0":{"name":"@stapel/listings-react","version":"0.36.0","license":"MIT","_id":"@stapel/listings-react@0.36.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"cce9e9ba06ec31cb0d478ec38b730077cf1258dd","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.36.0.tgz","fileCount":361,"integrity":"sha512-MnfP8O9a4+nE6RlTzC/cWo3/YSbpDV6rlOeBi6h9xvAgv5nNS0WvJJXiAt64FT+O/1UPQCo5dXhZu/IRPIMRBQ==","signatures":[{"sig":"MEUCIQDikb9B1VQ2umTlSnfnFW00Xk6I2mmMEfkW0MyoNq2SbgIgH+iVT7m53BuIxaNtlzWWjmYcQLUTwSXEU/f5pFCIWpA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIFSMJicKCsJCNrrj8kOppPnf0ElXWt1SB48tXSazU6uVAiBvR9i8BOoVYbpsGT31/q9+ttutz7pJUKxoYNnXdKjamw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.36.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2861492},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.36.0_1789500520130_0.6361673527165983","host":"s3://npm-registry-packages-npm-production"}},"0.36.1":{"name":"@stapel/listings-react","version":"0.36.1","license":"MIT","_id":"@stapel/listings-react@0.36.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"8aef79620aac6bd3c947080e9896db3bffd913cd","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.36.1.tgz","fileCount":361,"integrity":"sha512-frqw5opCvjZAeIB6Es2LgrlIulms0zY5hZlRqXILzxmp1mvIPVsTxeWSizDgxozGGf04o+U1Fwgzt7wL6hkG6A==","signatures":[{"sig":"MEUCIBUApBNwgAX9pjKmZmV8vNSv6UUPGHTvk831+CGrf5noAiEA+mvqSZRnt87zmuC0VYGRvMCT+IlCpHfdecFMpJAC9KY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCGf9hnY4zS39ul0TMnj3A4fWP60p+ipKMvPIt5QZq7VAIgfSLPAKSJ0pQVqC3LnsARFgA4o9Rh+5capnX7cvX9xyg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.36.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2864535},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for.","path":"dist/default/index.js","limit":"36 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.36.1_1789507647501_0.45592976003394914","host":"s3://npm-registry-packages-npm-production"}},"0.37.1":{"name":"@stapel/listings-react","version":"0.37.1","license":"MIT","_id":"@stapel/listings-react@0.37.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"37ef0a483b791e5f3f63a596a85be0c6dd5bccc3","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.37.1.tgz","fileCount":361,"integrity":"sha512-FO9yKbmGfTku8hHh/GZFziuCJPLvQfKGb0N9RmyO5fP7MAiEkEQTsZ0Gc2nissDo1bSkW06rnp0VL8RUOrFn/Q==","signatures":[{"sig":"MEUCIQDXVj+ZXwiTKTDK7VQyShx24icWEZqCu1pwo0hvUgNiOwIgUVE+1bfuOuM81TY2925D0HhPh6TU9otK7Ayz1y3L9Vo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIEy4GKTt3XThKegBSvDS1vPtiUYuVL+ZWQadSpMOpu3dAiAzhaNf+BUN0adnzRxqz/UDPG7gCXHg3hibRhT1OmoZBQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.37.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2894928},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.37.1_1789517711338_0.5443346629957022","host":"s3://npm-registry-packages-npm-production"}},"0.38.0":{"name":"@stapel/listings-react","version":"0.38.0","license":"MIT","_id":"@stapel/listings-react@0.38.0","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"b83d0d42dea4b2d4a286e7c9712dc626d7bd478f","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.38.0.tgz","fileCount":361,"integrity":"sha512-aTaX5nywpbg4/vIYD5ZbBS/LK+OZAHB5AoYOfn4oKaaTs7BlHfak2W0DDYT6r+SK3CPqAlmcuyXxXosfhAGPug==","signatures":[{"sig":"MEQCIAi22Q4mh4qIZ+lvVyF9yxMqxkfqK83FyctvI3IdnGjfAiANr7X4WCTDxZ/hGC9t/OW3ZcDx5/cbrSHDbIW9IhPbPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIHYaRfWY0kp7Ct30o7EU9jb3zDt/O9rx0uJLOg9LSKWVAiEA9L1RTdU1vx5WyVtn8lUyd6xz9xPtaNsv8lJEwTVxfpM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.38.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2906444},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.38.0_1789725846920_0.7382379457595889","host":"s3://npm-registry-packages-npm-production"}},"0.38.1":{"name":"@stapel/listings-react","version":"0.38.1","license":"MIT","_id":"@stapel/listings-react@0.38.1","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"d73cfa01491554df7d93b7d502bf966610aef5be","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.38.1.tgz","fileCount":361,"integrity":"sha512-x1Bvad2a6Fj8lM6zLYKkM0bCtY25v8VjugRmGoUvtEICnlewCl3lSZliDWUkt7MG25MalJE+5WoJwNwZHunSOw==","signatures":[{"sig":"MEUCIG+oPw74mVdJc/fbGJINGQo9fucu5QG5nA8tuXGXhTxfAiEAgoOyZESF/7ubEinq8NH0n3iE3tcxmRj+Qlw5TzUxhWw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQCi8n5uD5hLHn3RrB3Gq7QlaB16R2GR86HqtvHkxOHwmgIgR1tYpQEPnEs1zJiPz39/AxqCD71j66OlTcdOvWteFCA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.38.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2907369},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.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/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.38.1_1790257510042_0.7378520137766054","host":"s3://npm-registry-packages-npm-production"}},"0.38.2":{"name":"@stapel/listings-react","version":"0.38.2","license":"MIT","_id":"@stapel/listings-react@0.38.2","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"7bb431cc1e78c931dc534e38cd8d569203428fa5","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.38.2.tgz","fileCount":361,"integrity":"sha512-X1S6rVWCOY6OcOl/rLN7f8qbnGFrN1dyayO5c0xFKz+UuosZ+ZFZpFIaCg39i0dx7QT31y8Tz/4srnUw94UjpQ==","signatures":[{"sig":"MEUCIQD+ebZIIIOFM59xOq1jIREpRHr6uTOxOqJ3EtS4gfAFUAIgS8xuAaHjqPywRSKzSRAuT5gxXl9fv45cmdCVljkjMdg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQC8QPhRcxOGFPgmVFu4GM7PXU81FWzrwXH98JMyuMs5kQIgPdqPNflHUoUpgKjz0vptrFuenUzFdYbCldaPSwCtvfQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.38.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2905239},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.27.0","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.0","@stapel/currencies-react":"^0.4.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.27.0 <1.0.0","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.38.2_1790371531747_0.4061079258219029","host":"s3://npm-registry-packages-npm-production"}},"0.38.3":{"name":"@stapel/listings-react","version":"0.38.3","license":"MIT","_id":"@stapel/listings-react@0.38.3","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"dist":{"shasum":"a7a8a6e535a195fa28b04e7ccd6f78f69bb59727","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.38.3.tgz","fileCount":361,"integrity":"sha512-A1Cl9ohruKJbv1eMItNNqh/T9r1suFtK4NVrWTTVWKHza7dnTDGt8mXkqpNsImbfT+Q4j1H7bxpjed70Q6qFtA==","signatures":[{"sig":"MEQCIEXkRplyeK243uNFL4wLOLvMrLvYTjNE5H9kdwpv8YzKAiBAnZJOzT+QeJ/q+Nag+MgvMRvc6kwt5Mov7peXYmGOWw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICOoLAaQA1drytcxdbgXOHBvbE8o7HErZcAvsMrzWylmAiAruM/DESWPTphwBReNHmaMgdiuU26d+2oZtDg7bgV1vQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.38.3","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2907802},"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","./package.json":"./package.json","./manifest.json":"./manifest.json","./nav-manifest.json":"./nav-manifest.json"},"scripts":{"lint":"eslint .","size":"size-limit","test":"tsc -p tsconfig.test.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:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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.28.1","@types/react":"^19.1.0","@stapel/image":"^0.4.2","@stapel/tokens":"^0.8.1","@stapel/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.17.1","@stapel/currencies-react":"^0.4.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.27.0 <1.0.0","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/listings-react_0.38.3_1790384591290_0.3681914810906035","host":"s3://npm-registry-packages-npm-production"}},"0.39.0":{"_id":"@stapel/listings-react@0.39.0","dist":{"shasum":"a4bd59d92b10cb8c6a7f04e642b96e7de0cdda9f","tarball":"https://registry.npmjs.org/@stapel/listings-react/-/listings-react-0.39.0.tgz","fileCount":361,"integrity":"sha512-rSr8wVfLCzizkbVVk1Ek3XzmYz9pARxHmGLjyMfhBM0RJVoDOcBaqAAx7L2CO0ZndepLoiFAe5KyvEBXzVUXUQ==","signatures":[{"sig":"MEUCIGrnjMdZCnDGlHz3VnMzt4lwjr3kdr97VAE+gbTtxIopAiEAiNqwjdtxfP+tlM+yuElQhccyOKTeVMMEczLadVQ1dig=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDPNQoNBLpToDGQMtQ+pyTcQ0+673NOE4twsqOGmv9BogIhAI+2YBNgmgXGohdCEfY8BT4jxJzRGLQ8Snfb8q1VzrN7"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@stapel%2flistings-react@0.39.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2918521},"main":"./dist/index.js","name":"@stapel/listings-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","./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.test.json && vitest run --exclude test/prodBundlePurity.test.ts","build":"tsc -p tsconfig.json","test:pack":"vitest run test/prodBundlePurity.test.ts"},"version":"0.39.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:b2191289-8e30-4154-abf5-009b0780d707"}},"repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"size-limit":[{"name":"index — the headless pair (client + status axes + draft model + hooks): no antd. Raised 11 -> 12 KB for the elevation gate (useElevatableMandateGate + core's useElevation): the anonymous arm can now mint an identity for a named action instead of refusing, and that is a state hook the gate did not previously carry. Raised 11.5 -> 12 KB for envelopeFieldErrors and its API-field -> control table: a save-draft/create 400 names its field in the envelope rather than in a publish batch, and without the table the refusal had nowhere to land — which is how one over-precise coordinate painted two unreadable banners and left every control clean. Thirty-six bytes of routing table is what a legible refusal costs. Raised 12 -> 13 KB for two seams the mobile wave needed in the HEADLESS half: the category-feature copy source in model/features.ts (the option table a stored select does not carry, so a published listing prints \"Second-hand\" and not \"b-u\"), and firstUnsatisfied (the field a \"10 required details are still empty\" count actually points at, in the order the form asks). Both are model, not skin: a headless host renders its own controls and needs the same two answers. Raised 13 -> 14 KB (measured 12.91) for the engagement overlay: a batch read, its normalized key, and the scope that runs it once for a page and hands every card its own entry. It is a whole new READ rather than a flag — and it is the read that makes the viewed/saved state visible at all on a feed and a SERP, which come from the search index and carry no per-viewer field. Landing at 12.91 of 13 would have been a budget passed by rounding. Raised 14 -> 15 KB (measured 14.39) for the two model modules the listing-page wave added to the HEADLESS half: model/featureText.ts, which typesets a numeric value instead of stringifying it (its unit resolved from the definition, its digits through Intl.NumberFormat — the live page read 'Power 173' and 'Mileage 20000'), and model/cardBadges.ts, the card badge contract's four presentations plus the detector that falls back to the old rendering on an older backend. Both are answers a headless host needs as much as the skin does: a container drawing its own spec rows has the same value and the same missing unit. Raised 15 -> 16 KB (measured 15.27) for the two model answers the desktop/mobile wave needed in the HEADLESS half: the fourth dashboard tab (D407 — `MY_LISTINGS_COUNTED_TABS` beside `MY_LISTINGS_TABS`, `countedTabOf`, the removed tab's own status set, and the tab count that comes from the takedowns' own read because `my/counters` has three integers and no fourth), and the spec-line disambiguation in model/cardBadges.ts (the caption/answer punctuation per surface, plus the pass that tells two axes wearing one unit apart). Both are answers a headless host needs as much as the skin does: a container drawing its own tab strip has the same missing count, and one drawing its own spec line has the same two axes. Raised 16 -> 17 KB (measured 15.99) for `useShare`: the canonical-URL resolution, the three networks' encoded endpoints, the clipboard write and the native-sheet capability probe. The previous ceiling was reached EXACTLY — 15.99 of 16 — and a budget passed by rounding is a budget the next sentence fails. It is in the headless half deliberately: a host drawing its own share menu needs the same three hrefs and the same rule that a canonical route beats the address bar. Raised 17 -> 18 KB (measured 16.95) for the desktop gallery's four key names, and for the drift that had already eaten this budget without anybody re-measuring it: the bundle at HEAD, dependencies held constant, is 16.92 of 17 — fifty bytes of room, reached by no change of this pair's at all. The four sentences the hero and its lightbox needed (open, previous, next, close) then cost thirty more. The entry above has warned six times about a budget passed by rounding; this is one, and it was one BEFORE this wave touched it. 18 leaves 1.05 KB.","path":"dist/index.js","limit":"18 KB"},{"name":"default — the antd skin (three cards, detail, composer, dashboard, the named slots and the delete confirmation) must stay out of the main bundle. Raised 17 -> 19 KB for the mobile wave: <ListingSerpCard> (photo strip + price-first block + action rail), <ListingFeedCard> and <FeedGrid> are two more card surfaces on the same shared target/favourite/photo parts, not three copies of one Raised 19 -> 20 KB for the desktop wave of the detail page: layout=\"split\" is a second ASSEMBLY of the money page (the sticky buy column, the two-column spec table, the widened measure) over the same parts, and GateReasonPopover is the blocked heart's third volume — the reason and the door disclosed on interaction, with the visually-hidden copy that keeps the refusal in the accessibility tree. Both are geometry and wiring, not new widgets. Raised 20 -> 21 KB (measured 20.22) for the engagement wave, which is four small things and no new component: the disclosure became a controlled open/close so a pointer that hovers and then clicks does not shut the only explanation the control has; the heart draws a filled accent when saved and states a failed save through the shared ErrorAlert; an already-seen card dims through one rule in the sheet all three cards already hoist; and the listing page gained a view-count row. 216 bytes is what a control that reports its own outcome costs. Raised 21 -> 22 KB for the seller's board becoming a door in both directions: the transition route and useTransitionListing, OWNER_TRANSITIONS/ownerMoves as the fallback mirror, ListingActionsBag.moves drawn in a stable order, listingHref/linkComponent on the cabinet pane, the refusal that stops quoting the wire, and the row that fits a phone. Measured on a clean tree, this package's src reverted to the previous commit with dependencies held constant: 20.82 -> 21.60 KB. The old ceiling had 180 B of room and the work needs 780; none of it is copy, and a fourth axis of owner state is not a rounding error. Raised 22 -> 25 KB (measured 23.94) for the three surfaces of the same wave: <ListingSpecList>/<ListingSpecColumns>, which is a REPLACEMENT of antd's <Descriptions> with a paragraph row (an inline muted label and the value in one text flow, so a long answer wraps at the measure instead of stacking inside a third-of-a-page cell) and therefore carries its own hoisted sheet; <CardBadges>/<CardSpecLine>, one badge renderer for all three card surfaces with the pre-contract path kept whole beside it; and cardGallery.ts, the hover-scrub and swipe gestures — a segment map, a horizontal-intent threshold, the pointer-capability gate and the touch-action rule that leaves the page's vertical scroll to the browser. A gallery a card did not have and a spec list rebuilt from a table are not a rounding error. Raised 25 -> 26 KB (measured 25.34) for three small things and no new component: the dashboard's fourth tab and the takedown notice that shrank to one line above it (D407), the delete dialog choosing its sentence from the row's own remaining moves rather than printing the archive at somebody standing in the archive, and the photo strip's \"1 of 16\" counter with its two CSS rules (D418's neighbour on the card). None of it is copy; the counter is the one thing on a phone card that says a swipe is worth making. Raised 26 -> 29 KB (measured 27.56) for the reader's two actions: <ShareAction> (the native-sheet arm, the desktop menu with its three outbound links and the clipboard row, and the copy confirmation that stands in the menu rather than only in a toast), <ListingActions> (the cluster the listing page and the cards lay out through), actionRow.ts (two hit-target tiers as a class contract — 44px on the page, 36/44 on a card — plus the overlay pin and the label's phone arm) and notice.ts (the message seam, which is antd's own App/static message and no new dependency). Measured with dependencies held constant: 25.34 -> 27.56 KB. A verb the product did not have at all is not a rounding error. Raised 29 -> 31 KB (measured 29.92) for the two seams a live container was working around with a second component and an `!important`: the MOVABLE CLUSTER (movableCluster.tsx — the portal, the slot registry, the settle that appends the container into the highest-priority mount on screen, and the pane's two slots plus the bar layer) and the GALLERY LAYOUT (detailGallery.ts — the class, the two arms and the strip's child rule, hoisted because an inline style cannot reach a child), together with `useTitleVisibility`'s IntersectionObserver. Measured with dependencies held constant, this package's src at HEAD built into a scratch tree and then this one: 27.72 -> 29.92 KB. 30 would have left 80 B, which is the budget-passed-by-rounding this entry has warned about four times; 31 leaves 1.08 KB. What was bought: a page that mounts ONE `useFavoriteToggle` instead of two, and a host stylesheet that no longer needs `!important` over a pair's own geometry. Raised 31 -> 33 KB (measured 31.84) for the four absences the closing-wave comparison filed against this page, none of which is copy and none of which is a variant of something already here: the CONDENSED BAR the pane now draws itself (condensedBar.ts plus the bar's own assembly and the title-visibility state — the thing every container was writing identically around `renderActionsBar`, and it borrows the SAME travelling cluster, so it adds no second `useFavoriteToggle`); the STRIP'S POSITION (`useGalleryPosition` — a throttled scroll reading, the frame the counter stands in because an absolute child of a scroller scrolls away with the content it is counting, and the pill's own rules: the phone gallery had no active-photo indicator at all, REPORT §20b); the FOUR CANNED QUESTIONS above the chat door (§16, all four comparisons — the one control on this page that turns a reader into a conversation); and `<ListingRelatedStrip>`, the two find-more sections the reference ends a listing with (§16 comparison 4), which is a new component with its own hoisted sheet. The spec fold (`limit`) rides along for about ninety bytes. Measured with dependencies held constant, this package's src at HEAD and then this one: 30.24 -> 31.84 KB. 32 would have left 160 B — the budget-passed-by-rounding this entry has now warned about five times; 33 leaves 1.16 KB. Raised 33 -> 36 KB (measured 34.59) for the DESKTOP GALLERY, which is a component this page did not have in any form: `<ListingHeroGallery>` (the hero button, the filmstrip whose thumbnails carry the active state as `aria-current`, and the lightbox) plus the hero arm's own rules in detailGallery.ts. The lightbox is the weight and none of it is decoration: a ring over the photographs, two arrow controls, the two arrow keys, a swipe read through the card gallery's own `swipeStep`, and the three things `<SkinDialog>` does not do for a photograph viewer — focus in on open, a Tab trap over the whole dialog (its close control is a sibling of our body, so the listener is on the dialog), and focus restored to the opener on every way out. Two arrow glyphs ride along for about eighty bytes. Measured with dependencies held constant, this package's src at HEAD built into this same tree and then this one: 32.91 -> 34.59 KB — and note the first number, because 32.91 of 33 is 90 B of headroom that arrived with no change of this pair's. 35 would leave 410 B, which is the budget-passed-by-rounding this entry has now warned about six times; 36 leaves 1.41 KB. What was bought: a listing page where a person can look at the thing being sold, which is what a classified is for. Raised 36 -> 37.5 KB (measured 36.15) for the seller-trust panel, the strip's gesture layer, and three selectors that could not win. Two of the three are behaviour this package is now responsible for: <ListingSerpCard trustPanel> is the 220px column the reference fills its 980px results row with (the seller, a one-line rating, badge SLOTS and both verbs) and is a component this card did not have in any form; and the detail strip now commits a swipe through swipeStep instead of native scroll-snap, which could express neither half of the owner's rule — there is no threshold to set because the browser snaps to the NEAREST point, and scroll-snap-stop governs a fling's momentum rather than a finger the scroller is following, so one long drag advanced two photographs. The third is the two gallery counters and the condensed title doubling their selectors: a single class ties the per-theme class antd injects at runtime and loses on order, which had left the detail counter's font-size, line-height AND its white colour inert over a 55% black photo scrim. WHERE THE BYTES CAME FROM, measured rather than assumed: the SAME src builds to 35.44 KB against the siblings pinned before this train and 36.15 KB against the ones it bumped, so roughly 710 B of the growth is not this package's source at all — the overage is 152 B and the sibling delta alone is larger than it. The remainder is the panel and the gesture layer. 37 would leave 850 B, which is the budget-passed-by-rounding this entry has now warned about seven times; 37.5 leaves 1.35 KB, the same headroom the 33 -> 36 raise left.","path":"dist/default/index.js","limit":"37.5 KB"},{"name":"i18n/ru — the Russian bundle is opt-in, not carried by the main entry. Raised 5 -> 5.5 KB (measured 5.02): three sentences the wave added — the fourth tab and its empty state, and the delete warning that does not promise the archive to a listing already in it. A bundle sitting exactly ON its limit is a limit the next sentence breaks. Raised 5.5 -> 6 KB (measured 5.48) for the three features_draft refusals the stapel-listings 0.22.3 pin brought with it: each of these three has to NAME the shape it wanted rather than say \"try again\". 5.48 of 5.5 is twenty bytes of headroom — the rounding this entry already warns about. The 0.22.8 pin then moved the seventeen module-owned sentences from this file to the module's own catalogue: same keys, upstream wording, 5.52 KB.","path":"dist/i18n/ru.js","limit":"6 KB"},{"name":"i18n/es — the Spanish bundle is opt-in, not carried by the main entry. Raised 3.5 -> 4 KB: the mobile wave's four card keys landed the bundle exactly ON the old limit, and a budget a release passes by rounding is a budget that fails the next one. Raised 4 -> 4.5 KB (measured 3.94) for the share wave's ten sentences, which landed it on that limit again by the same 60 bytes. Raised 4.5 -> 5 KB (measured 4.35) for the desktop gallery's four: at HEAD this bundle is 4.32 of 4.5, so the four sentences land it 150 B from a ceiling it was already close to, and this file has now been raised twice for exactly that. 5 leaves 650 B.","path":"dist/i18n/es.js","limit":"5 KB"}],"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","directories":{},"maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"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/showcase":"^0.3.0","@types/react-dom":"^19.1.0","@stapel/tokens-antd":"^0.22.1","@tanstack/react-query":"^5.81.0","@testing-library/react":"^16.3.0","@stapel/attributes-react":"^0.18.0","@stapel/currencies-react":"^0.4.0","@size-limit/preset-small-lib":"^11.2.0"},"peerDependencies":{"antd":">=5.20.0 <7","react":">=19","@stapel/core":">=0.27.0 <1.0.0","@stapel/image":">=0.2.0","@stapel/tokens-antd":">=0.15.0","@tanstack/react-query":"^5.0.0","@stapel/attributes-react":">=0.16.4","@stapel/currencies-react":">=0.2.0"},"peerDependenciesMeta":{"antd":{"optional":true},"@stapel/tokens-antd":{"optional":true},"@stapel/currencies-react":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/listings-react_0.39.0_1790493793180_0.3914255905205233"}}},"time":{"created":"2026-08-22T13:07:24.800Z","modified":"2026-09-27T07:23:13.627Z","0.1.0":"2026-08-22T13:07:25.180Z","0.2.0":"2026-08-22T23:27:55.838Z","0.3.0":"2026-08-23T08:03:37.902Z","0.3.1":"2026-08-23T17:35:00.453Z","0.4.0":"2026-08-23T21:58:00.709Z","0.7.0":"2026-08-26T20:59:04.700Z","0.8.0":"2026-08-28T03:52:28.345Z","0.8.1":"2026-08-29T23:06:07.968Z","0.9.0":"2026-08-30T21:08:09.935Z","0.9.1":"2026-08-30T23:16:00.198Z","0.10.0":"2026-08-31T01:17:48.283Z","0.11.0":"2026-08-31T06:50:31.548Z","0.12.0":"2026-08-31T09:53:02.211Z","0.13.0":"2026-08-31T12:29:17.143Z","0.14.0":"2026-08-31T14:21:32.839Z","0.14.1":"2026-09-01T18:52:50.274Z","0.15.0":"2026-09-02T05:58:58.966Z","0.15.1":"2026-09-02T09:21:24.812Z","0.17.0":"2026-09-02T15:56:57.009Z","0.18.0":"2026-09-02T18:42:56.248Z","0.18.1":"2026-09-02T20:24:04.094Z","0.18.2":"2026-09-02T21:04:05.898Z","0.19.0":"2026-09-03T00:53:35.479Z","0.20.0":"2026-09-03T03:54:48.331Z","0.21.0":"2026-09-03T08:22:06.094Z","0.22.0":"2026-09-03T12:42:10.413Z","0.22.1":"2026-09-04T07:35:31.848Z","0.23.0":"2026-09-04T09:01:02.993Z","0.24.0":"2026-09-04T10:12:27.038Z","0.25.0":"2026-09-04T13:18:34.184Z","0.25.1":"2026-09-05T10:16:23.529Z","0.25.2":"2026-09-05T14:20:56.947Z","0.25.3":"2026-09-05T16:41:53.361Z","0.25.4":"2026-09-05T18:10:08.440Z","0.25.5":"2026-09-05T19:00:06.512Z","0.25.6":"2026-09-05T19:47:54.956Z","0.25.7":"2026-09-05T22:50:51.076Z","0.25.8":"2026-09-06T00:16:31.301Z","0.25.9":"2026-09-06T01:59:06.117Z","0.25.10":"2026-09-06T03:33:14.161Z","0.26.0":"2026-09-06T08:26:58.211Z","0.27.0":"2026-09-06T11:00:54.914Z","0.28.0":"2026-09-06T12:03:22.535Z","0.28.1":"2026-09-06T14:16:01.614Z","0.29.0":"2026-09-08T09:08:49.947Z","0.29.1":"2026-09-08T10:12:32.833Z","0.30.0":"2026-09-11T01:39:26.609Z","0.30.1":"2026-09-11T22:49:20.245Z","0.30.2":"2026-09-12T00:32:07.919Z","0.30.3":"2026-09-13T00:11:57.769Z","0.30.4":"2026-09-13T00:56:11.827Z","0.30.5":"2026-09-13T01:39:09.470Z","0.30.6":"2026-09-13T02:14:09.384Z","0.32.0":"2026-09-13T05:19:21.437Z","0.33.0":"2026-09-13T11:59:03.269Z","0.33.1":"2026-09-13T16:30:18.296Z","0.34.0":"2026-09-13T18:29:28.315Z","0.35.0":"2026-09-13T20:46:50.630Z","0.36.0":"2026-09-15T19:28:40.228Z","0.36.1":"2026-09-15T21:27:27.626Z","0.37.1":"2026-09-16T00:15:11.443Z","0.38.0":"2026-09-18T10:04:07.048Z","0.38.1":"2026-09-24T13:45:10.191Z","0.38.2":"2026-09-25T21:25:31.971Z","0.38.3":"2026-09-26T01:03:11.427Z","0.39.0":"2026-09-27T07:23:13.280Z"},"license":"MIT","repository":{"url":"https://github.com/usestapel/stapel-react.git","type":"git","directory":"packages/listings-react"},"description":"Headless React pair for stapel-listings: a typed client over the draft twin, the composer that turns a category schema into a submittable listing, and the owner's dashboard. Two independent axes are rendered as two — lifecycle `status` decides visibility ","maintainers":[{"name":"ucsoftworks","email":"ucsoftworks@gmail.com"}],"readme":"","readmeFilename":""}