{"_id":"@apostel/bedrock","_rev":"4-674382c1c2c8d6567f8415d6add6956b","name":"@apostel/bedrock","dist-tags":{"latest":"0.2.1"},"versions":{"0.1.0":{"name":"@apostel/bedrock","version":"0.1.0","keywords":["accessibility","anchor-positioning","dialog","headless","invoker-commands","popover","primitives","radix","react"],"license":"MIT","_id":"@apostel/bedrock@0.1.0","maintainers":[{"name":"sam-apostel","email":"sam@apostel.be"}],"homepage":"https://github.com/Sam-Apostel/bedrock-ui#readme","bugs":{"url":"https://github.com/Sam-Apostel/bedrock-ui/issues"},"dist":{"shasum":"fc3c175b1b2c306abbe642a85392d7ee25334876","tarball":"https://registry.npmjs.org/@apostel/bedrock/-/bedrock-0.1.0.tgz","fileCount":285,"integrity":"sha512-g5zcILsxuS531/SgP20x3m4N9ujcueJ80CpeTv3FSnO2kzN1vq9imFG3VLktRIYy3ENrkW+CGoDgDpZ99PicUA==","signatures":[{"sig":"MEQCIDLBJEF5im7+CiKQyuI4Q4/rmoxhsOLQq36SMF4pLJjkAiBqiAz9omFSKillkVqsnOHzQCIb81j3oPgKWiT3aqF1pA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@apostel%2fbedrock@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":413686},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./controlled":{"types":"./dist/controlled.d.ts","default":"./dist/controlled.js"},"./bedrock.css":"./dist/bedrock.css"},"gitHead":"eca31ce18016accd7a9dd158ced1eb0eac8e69ef","scripts":{"lint":"oxlint","test":"playwright test","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","format":"oxfmt","verify":"npm run format:check && npm run lint && npm run typecheck && npm run lint:graph && npm run build && npm run test","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit -p tsconfig.json","docs:build":"node scripts/build-docs.mjs","lint:graph":"depcruise src --config .dependency-cruiser.cjs","format:check":"oxfmt --check","test:install":"playwright install chromium","prepublishOnly":"npm run verify","registry:build":"node scripts/build-registry.mjs"},"_npmUser":{"name":"sam-apostel","email":"sam@apostel.be"},"repository":{"url":"git+https://github.com/Sam-Apostel/bedrock-ui.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless React primitives built on native platform features","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"vite":"^8.2.0","oxfmt":"^0.61.0","marked":"^15.0.12","oxlint":"^1.76.0","typescript":"^5.6.0","@types/react":"^19.0.0","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","dependency-cruiser":"^16.0.0","@axe-core/playwright":"^4.12.1","@vitejs/plugin-react":"^6.0.5"},"peerDependencies":{"react":">=19","react-dom":">=19"},"_npmOperationalInternal":{"tmp":"tmp/bedrock_0.1.0_1788112920882_0.7318604185144431","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@apostel/bedrock","version":"0.1.1","keywords":["accessibility","anchor-positioning","dialog","headless","invoker-commands","popover","primitives","radix","react"],"license":"MIT","_id":"@apostel/bedrock@0.1.1","maintainers":[{"name":"sam-apostel","email":"sam@apostel.be"}],"homepage":"https://github.com/Sam-Apostel/bedrock-ui#readme","bugs":{"url":"https://github.com/Sam-Apostel/bedrock-ui/issues"},"dist":{"shasum":"adf71ac00ddddb73656242c85590a55b0d6dae6a","tarball":"https://registry.npmjs.org/@apostel/bedrock/-/bedrock-0.1.1.tgz","fileCount":285,"integrity":"sha512-L39ScMAlpmLOgqkoeHH7FzRdYFspNJPgbZuj8b9/QBmkMwTSwyj37WX8+P3FrQPunXDYRyQ8kp8GpTmLlFeVBQ==","signatures":[{"sig":"MEYCIQCaMHuURJRzDQvALd7truo9eidgNo0lB/ddAfHxe/UWAAIhAK1wmJhMm0ocq3DrtYCel0LNJ4reNdRnaYBGiEcIoLjC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@apostel%2fbedrock@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":410954},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./controlled":{"types":"./dist/controlled.d.ts","default":"./dist/controlled.js"},"./bedrock.css":"./dist/bedrock.css"},"gitHead":"bf404df826ec1b2add4a6f0c21854580f98705ca","scripts":{"lint":"oxlint","test":"playwright test","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","format":"oxfmt","verify":"npm run format:check && npm run lint && npm run typecheck && npm run lint:graph && npm run build && npm run test","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit -p tsconfig.json","docs:build":"node scripts/build-docs.mjs && npm run demos:build","lint:graph":"depcruise src --config .dependency-cruiser.cjs","demos:build":"vite build --config vite.demos.config.ts","format:check":"oxfmt --check","test:install":"playwright install chromium","docs:baseline":"node scripts/build-baseline.mjs","prepublishOnly":"npm run verify","registry:build":"node scripts/build-registry.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28d234c6-e69f-4c8c-ad4c-1de8af6998d3"}},"repository":{"url":"git+https://github.com/Sam-Apostel/bedrock-ui.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless React primitives built on native platform features","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.1.1","vite":"^8.2.0","oxfmt":"^0.61.0","marked":"^15.0.12","oxlint":"^1.76.0","typescript":"^5.6.0","tailwindcss":"^4.3.3","@types/react":"^19.0.0","lucide-react":"^1.39.0","tailwind-merge":"^3.6.0","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","dependency-cruiser":"^16.0.0","@axe-core/playwright":"^4.12.1","@vitejs/plugin-react":"^6.0.5"},"peerDependencies":{"react":">=19","react-dom":">=19"},"_npmOperationalInternal":{"tmp":"tmp/bedrock_0.1.1_1788385856488_0.9360871192251297","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@apostel/bedrock","version":"0.2.0","keywords":["accessibility","anchor-positioning","dialog","headless","invoker-commands","popover","primitives","radix","react"],"license":"MIT","_id":"@apostel/bedrock@0.2.0","maintainers":[{"name":"sam-apostel","email":"sam@apostel.be"}],"homepage":"https://github.com/Sam-Apostel/bedrock-ui#readme","bugs":{"url":"https://github.com/Sam-Apostel/bedrock-ui/issues"},"dist":{"shasum":"aa9b85e7e72d211c1c300328c1c33b417e1e3f73","tarball":"https://registry.npmjs.org/@apostel/bedrock/-/bedrock-0.2.0.tgz","fileCount":285,"integrity":"sha512-R3rchzDLLJlW4mvuMekHbDVSUBtn//PSqjgzhg7h7kw//o42toxLvf4WvoEllw/HMOJau7AgPUlhObbLUbFG2Q==","signatures":[{"sig":"MEUCIFROCQjv4SZaKsZXQa56re38R6B9f9mZPLLwUf+oRIG0AiEAzCMilVt8TboGo5aF9THfxfl8BTlpIHWf5WtpnSIlZ0c=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@apostel%2fbedrock@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":426086},"type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./controlled":{"types":"./dist/controlled.d.ts","default":"./dist/controlled.js"},"./bedrock.css":"./dist/bedrock.css"},"gitHead":"f65b4bb987fe86c13d0d284b540efc873f980594","scripts":{"lint":"oxlint","test":"playwright test","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","format":"oxfmt","verify":"npm run format:check && npm run lint && npm run typecheck && npm run lint:graph && npm run build && npm run test","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit -p tsconfig.json","docs:build":"node scripts/build-docs.mjs && npm run demos:build","lint:graph":"depcruise src --config .dependency-cruiser.cjs","demos:build":"vite build --config vite.demos.config.ts","compat:build":"node scripts/build-compat.mjs","format:check":"oxfmt --check","test:install":"playwright install chromium","docs:baseline":"node scripts/build-baseline.mjs","prepublishOnly":"npm run verify","registry:build":"node scripts/build-registry.mjs"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28d234c6-e69f-4c8c-ad4c-1de8af6998d3"}},"repository":{"url":"git+https://github.com/Sam-Apostel/bedrock-ui.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless React primitives built on native platform features","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.1.1","vite":"^8.2.0","oxfmt":"^0.61.0","marked":"^15.0.12","oxlint":"^1.76.0","typescript":"^5.6.0","tailwindcss":"^4.3.3","@types/react":"^19.0.0","lucide-react":"^1.39.0","web-features":"^3.36.0","tailwind-merge":"^3.6.0","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","dependency-cruiser":"^16.0.0","@axe-core/playwright":"^4.12.1","@vitejs/plugin-react":"^6.0.5","@mdn/browser-compat-data":"^8.0.13"},"peerDependencies":{"react":">=19","react-dom":">=19"},"_npmOperationalInternal":{"tmp":"tmp/bedrock_0.2.0_1788433378531_0.27293701747188526","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"_id":"@apostel/bedrock@0.2.1","bugs":{"url":"https://github.com/Sam-Apostel/bedrock-ui/issues"},"dist":{"shasum":"860146a367025149fe551c963dba899035c75bfb","tarball":"https://registry.npmjs.org/@apostel/bedrock/-/bedrock-0.2.1.tgz","fileCount":285,"integrity":"sha512-F8RWYosxEcuXrPvue2VSLTdGbp0fvCIy9BrzZQn2pmq6vUwVktuiCOHrMWID6jxgASeUOdpeCaDdEnI3NHm66A==","signatures":[{"sig":"MEUCIQD1LTpk9ZgGZGPnMOoQhtVTqI4Ya4hXJhe86K6X8ioYVwIgN+BseipeZV+7N3ejKMIGAgKewmKoRBv/OSNzE9Q6/wg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCosD9WuKBYzLjWEN5NZMh7sL2rPIT55Eoet9rrAE4QdQIgLQvHGph312RvPYV6BwpnJwuc9wO+Zqa68HwCMuMigvg="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@apostel%2fbedrock@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":437909},"name":"@apostel/bedrock","type":"module","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"./controlled":{"types":"./dist/controlled.d.ts","default":"./dist/controlled.js"},"./bedrock.css":"./dist/bedrock.css"},"gitHead":"2ffa5296907b029dc3b7c769ed72b9854356c45a","license":"MIT","scripts":{"lint":"oxlint","test":"playwright test","build":"tsc -p tsconfig.build.json && node scripts/postbuild.mjs","format":"oxfmt","verify":"npm run format:check && npm run lint && npm run typecheck && npm run lint:graph && npm run build && npm run test","release":"changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc --noEmit -p tsconfig.json","docs:build":"node scripts/build-docs.mjs && npm run demos:build","lint:graph":"depcruise src --config .dependency-cruiser.cjs","demos:build":"vite build --config vite.demos.config.ts","compat:build":"node scripts/build-compat.mjs","format:check":"oxfmt --check","test:install":"playwright install chromium","docs:baseline":"node scripts/build-baseline.mjs","prepublishOnly":"npm run verify","registry:build":"node scripts/build-registry.mjs"},"version":"0.2.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:28d234c6-e69f-4c8c-ad4c-1de8af6998d3"}},"homepage":"https://github.com/Sam-Apostel/bedrock-ui#readme","keywords":["accessibility","anchor-positioning","dialog","headless","invoker-commands","popover","primitives","radix","react"],"repository":{"url":"git+https://github.com/Sam-Apostel/bedrock-ui.git","type":"git"},"_npmVersion":"12.0.2","description":"Headless React primitives built on native platform features","directories":{},"maintainers":[{"name":"sam-apostel","email":"sam@apostel.be"}],"sideEffects":false,"_nodeVersion":"22.23.2","publishConfig":{"access":"public","provenance":true},"_hasShrinkwrap":false,"devDependencies":{"clsx":"^2.1.1","vite":"^8.2.0","oxfmt":"^0.61.0","marked":"^15.0.12","oxlint":"^1.76.0","typescript":"^5.6.0","tailwindcss":"^4.3.3","@types/react":"^19.0.0","lucide-react":"^1.39.0","web-features":"^3.36.0","tailwind-merge":"^3.6.0","@changesets/cli":"^3.0.1","@playwright/test":"^1.62.1","@types/react-dom":"^19.2.5","@tailwindcss/vite":"^4.3.3","dependency-cruiser":"^16.0.0","@axe-core/playwright":"^4.12.1","@vitejs/plugin-react":"^6.0.5","@mdn/browser-compat-data":"^8.0.13"},"peerDependencies":{"react":">=19","react-dom":">=19"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/bedrock_0.2.1_1788517176663_0.2967104312670572"}}},"time":{"created":"2026-08-30T18:02:00.573Z","modified":"2026-09-04T10:19:37.174Z","0.1.0":"2026-08-30T18:02:01.058Z","0.1.1":"2026-09-02T21:50:56.671Z","0.2.0":"2026-09-03T11:02:58.682Z","0.2.1":"2026-09-04T10:19:36.788Z"},"bugs":{"url":"https://github.com/Sam-Apostel/bedrock-ui/issues"},"license":"MIT","homepage":"https://github.com/Sam-Apostel/bedrock-ui#readme","keywords":["accessibility","anchor-positioning","dialog","headless","invoker-commands","popover","primitives","radix","react"],"repository":{"url":"git+https://github.com/Sam-Apostel/bedrock-ui.git","type":"git"},"description":"Headless React primitives built on native platform features","maintainers":[{"name":"sam-apostel","email":"sam@apostel.be"}],"readme":"# bedrock\n\nHeadless React primitives that let the browser do the layering, positioning and\ndismissal.\n\nRadix-shaped anatomy: compound components, `asChild`, the part names you\nalready type. Underneath, the top layer, invoker commands and anchor positioning\ndo the work that `Portal`, `Presence`, `DismissableLayer` and Floating UI used to\ndo.\n\n```bash\nnpm i @apostel/bedrock\n```\n\n<!-- demo: dialog -->\n\n## The shape\n\n```tsx\nimport { Dialog } from '@apostel/bedrock'\n\n<Dialog.Root>\n  <Dialog.Trigger>Delete project</Dialog.Trigger>\n  <Dialog.Content>\n    <Dialog.Title>Delete project?</Dialog.Title>\n    <Dialog.Description>This cannot be undone.</Dialog.Description>\n    <Dialog.Close>Cancel</Dialog.Close>\n    <button onClick={destroy}>Delete</button>\n  </Dialog.Content>\n</Dialog.Root>\n```\n\nrenders roughly this:\n\n```html\n<button commandfor=\"d1\" command=\"show-modal\">Delete project</button>\n<dialog id=\"d1\">…</dialog>\n```\n\nNo effect opens it. No state hook holds it. No portal moves it. The parser wires\nthe button to the dialog, so it works before hydration and keeps working if your\nbundle never arrives.\n\n## What it saves\n\nMeasured with esbuild, minified and gzipped, React external:\n\n<!-- sizes-figure -->\n\n| primitive | bedrock | Radix | |\n| --- | --- | --- | --- |\n| Checkbox | **0.70 kB** | 5.9 kB | 8.4× |\n| Slider | **0.74 kB** | 9.8 kB | 13.2× |\n| Select | **0.84 kB** | 31.5 kB | 37.5× |\n| Accordion | **1.61 kB** | 8.8 kB | 5.5× |\n| Dialog | **1.95 kB** | 13.7 kB | 7.0× |\n| Popover | **2.11 kB** | 24.2 kB | 11.5× |\n| Tooltip | **2.55 kB** | 19.3 kB | 7.6× |\n| DropdownMenu | **3.55 kB** | 31.6 kB | 8.9× |\n\nThe ratio is largest where the platform hands over a whole element and smallest\nwhere it hands over nothing but the layering. Menus are the case to budget from:\nthey save more kilobytes than anything but Select, and they still leave the\nlargest bedrock bundle in the library, because roving focus and typeahead have\nno native equivalent and ship either way.\n[Should you switch?](./docs/should-you-switch.md#3-the-saving-is-uneven)\nbreaks that down by group. The larger win is behavioural anyway: no z-index\nfights, no portal clipping, no repositioning on every scroll frame.\n\n## What it costs\n\nbedrock targets current browsers on purpose, and the price is a hard floor.\nTriggers are invoker commands with no JavaScript standing behind them, so:\n\n| | Chrome | Firefox | Safari |\n| --- | --- | --- | --- |\n| Minimum | **135** | **144** | **26.2** |\n\nAbove that line, missing features degrade: placement falls back to the centre of\nthe viewport, transitions are skipped, a `<select>` renders as the OS dropdown.\nThe component still opens, closes, traps focus and is announced correctly. Below\nit, nothing opens at all.\n\n[Browser support](./docs/compat.md) has every feature, its minimum version in\neach engine, and what its absence does to your UI, measured in the browser you\nopen it in.\n\n## Where to start\n\n- **[Getting started](./docs/getting-started.md)**: install, a first component,\n  and the one rule that applies to every trigger.\n- **[Should you switch?](./docs/should-you-switch.md)**: the case against\n  adopting this. Read it first if you are evaluating.\n- **[Migrating from Radix](./docs/migration-from-radix.md)**: what changes,\n  what breaks, and what to do about it.\n- **[shadcn registry](./docs/shadcn-registry.md)**: shadcn's own components with\n  Radix swapped for bedrock, installable with `npx shadcn add`.\n- **[Agent skill](./skills/migrate-to-bedrock/SKILL.md)**: does the mechanical\n  migration and brings you the four decisions it cannot make for you.\n\n## Status\n\n`0.1.1` on npm. All 29 primitives, 200 Playwright tests against real Chrome.\nWhat is missing is soak time and other engines, not components.\n\n[Contributing](./CONTRIBUTING.md) · [Releasing](./RELEASING.md) ·\n[Changelog](./CHANGELOG.md)\n","readmeFilename":"README.md"}