{"_id":"@data-slot/radio-group","_rev":"7-9f088ba9f0da2bf86ed0438707030389","name":"@data-slot/radio-group","dist-tags":{"latest":"1.0.2"},"versions":{"0.2.163":{"name":"@data-slot/radio-group","version":"0.2.163","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@0.2.163","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"70f5dad30d8fa5b622a9d3acc387a4bacfd03566","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-0.2.163.tgz","fileCount":6,"integrity":"sha512-YBoOzmpTF7QcQT1zKCi8Zub8x/y1PqxWA1Jh/94BTjQma8gCWM69Q7AQePa9m1C/PT/vBFPiSCdSzQZEV/qWGg==","signatures":[{"sig":"MEQCIDlb8atJ4X6lmOp7s37PkDjtTM8Z2nCe5Usw6kjxyZ4kAiAOxJCgM2GpMTgj80fB3zaXEiwJjJyf1CSlNUmwoqAp7w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@0.2.163","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21406},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.8.2","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@data-slot/core":"0.2.163"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_0.2.163_1774365513853_0.8999348034985193","host":"s3://npm-registry-packages-npm-production"}},"0.2.165":{"name":"@data-slot/radio-group","version":"0.2.165","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@0.2.165","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"44e3fe39538f6047f8968e843c4f97f7af9ae812","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-0.2.165.tgz","fileCount":6,"integrity":"sha512-Ilfl3qhU0xfrWikQFNSwDzlWx7UdUURK0XuY9/8cEHnhEaZSMy5I5Y+bJB/NSsu03MKMo94lprl5q13rYnfrZQ==","signatures":[{"sig":"MEYCIQDcTHenz8mx0tcsiB7Kol5xookF/uUhJUwFZIq1/OhCswIhANb2tmgYeSbktQ21pEIvsJ87OvRKqjqBqhta5Js1Exwb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@0.2.165","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21406},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.8.2","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","dependencies":{"@data-slot/core":"0.2.165"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_0.2.165_1774864378345_0.4143978598976428","host":"s3://npm-registry-packages-npm-production"}},"0.2.166":{"name":"@data-slot/radio-group","version":"0.2.166","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@0.2.166","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"7e4fd1a3bf659f5bc28ec5782be6d16552d1c085","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-0.2.166.tgz","fileCount":6,"integrity":"sha512-0CDJD3e+ap2o7REO5KPj8hkB75V/d3okiCaUmg3bDo+xzOkIxJ1qnif/I4QG5rRok9QBOcDjLYoyfY2Zjm9cVg==","signatures":[{"sig":"MEYCIQDP6zqxZaeflBuUrrGctgqSpbSb2Aa8c22Qx/4ywJy4ewIhANHcHvSutH/pF1Ukynrf8tkIerJfH3QqP8GLeXnq8y67","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@0.2.166","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21406},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.8.2","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","dependencies":{"@data-slot/core":"0.2.166"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_0.2.166_1775138902365_0.022668636754060945","host":"s3://npm-registry-packages-npm-production"}},"0.2.167":{"name":"@data-slot/radio-group","version":"0.2.167","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@0.2.167","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"85494cbcb49204b8c7b7d03b1f5e2fc07a65dcca","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-0.2.167.tgz","fileCount":6,"integrity":"sha512-ic+4cpWY9tQLll44+DZjlxYlbXyCv2Ei2AilWGi5lKMY5KF/maKI6mmTt7ViSHxYlHX2AfhsjuQna4PVWFbgXw==","signatures":[{"sig":"MEUCID+HX7OZnI/3Ty1xwMkThIPU/cuK3AWz+zwreMMZx8kUAiEAuSqb7EKzaPBLGYjvBRPvtd7TSI5myYDngHIvOuk8UTs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@0.2.167","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":21438},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.9.8","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@data-slot/core":"0.2.167"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_0.2.167_1789390163507_0.152705904373293","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@data-slot/radio-group","version":"1.0.0","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@1.0.0","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"99ba50e8c1cc714e53298e172b6fee1f5502bc11","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-1.0.0.tgz","fileCount":6,"integrity":"sha512-ceHuvnH/YTjRdNLUvW3kmMoVj0ipT4nymTtj+pGllBRdBzo/4P7HyTkg0gHn0KvlL1A3DKmDCFq+R9qOq3x0Yg==","signatures":[{"sig":"MEUCIQDAnfaUVLDiYrL+KtnQMS6d5WqdTnco+Q2PHB71lTnvuQIgeqrPYUcEM7yHqfmSUrFmcKq+WZsp5ot3Nv6L4J95BDk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDnFtP5W5l8wM0xd50h53rDzyKWJffOYZW42eBQ1jmyhAIhAN1/iHv4K5tDSN9ADfQz30g16MLiaJfgKsEWSYqe45VO","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22491},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.9.8","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@data-slot/core":"1.0.0"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_1.0.0_1790155909427_0.13688829192712593","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@data-slot/radio-group","version":"1.0.1","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"license":"MIT","_id":"@data-slot/radio-group@1.0.1","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"homepage":"https://github.com/bejamas/data-slot#readme","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"777997304b6eb40fd44c00f3cbf5f321ffafd034","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-1.0.1.tgz","fileCount":6,"integrity":"sha512-HCAmwdjBHY69R/q6V1k6Xc88lzfUP4idXQoOUkWwwKqqlP2DXH2NEuk9/p0zSBXDKerY8qg8UI0Ldvff/ydnIA==","signatures":[{"sig":"MEQCIAVha6RKTwzzBjCb7YHZQt3Mqs51xAL51SZJnbkUuCP+AiAE9sq77Yb1XN8Igv7Kd9cy2oTurqjQkmmj2S7ifKG0uw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIGUiKkLTizXYcRS/t2gGO+iR0VYFL02Ie1PJgJoxoZ3MAiEAtn6eQT2q6yaa2vZjAHbmBECdt9oHf9EdkTQMzJaYwgY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@1.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22291},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"scripts":{"build":"tsdown"},"_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.9.8","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@data-slot/core":"1.0.1"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/radio-group_1.0.1_1790408365061_0.02764742281263599","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"_id":"@data-slot/radio-group@1.0.2","bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"dist":{"shasum":"155c147a0c0b71ed1b16c87351d4e044a7fe0996","tarball":"https://registry.npmjs.org/@data-slot/radio-group/-/radio-group-1.0.2.tgz","fileCount":6,"integrity":"sha512-Pp2clfsNDm2g1JdLhRs3a7c9t2k4gYtEndxBkQ6E9wwcHLs0fXiUiG3JMyenGPGdTdNkAlfq3Y9yY+z73AXycg==","signatures":[{"sig":"MEQCIB95xMszz0SaF4YmQCF/FVjSBy+4RMkprEgvjw+jWzB8AiBTW36qZ929Jt11X8Holl4HxTEzE4dfcm+mP2W9Ov0+nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCPvku/Puaj5fAHK/KDM+f7TdtF9RgO+dyvPty7yBmpdQIhAN5i3mdZQ16vU164gpaXN6Ko61mxHe7eu40LtZhFxMzE"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@data-slot%2fradio-group@1.0.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22291},"main":"./dist/index.cjs","name":"@data-slot/radio-group","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"}},"license":"MIT","scripts":{"build":"tsdown"},"version":"1.0.2","_npmUser":{"name":"thomkrupa","email":"thom@bejamas.com"},"homepage":"https://github.com/bejamas/data-slot#readme","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"_npmVersion":"10.9.8","description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","directories":{},"maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"sideEffects":false,"_nodeVersion":"22.23.2","dependencies":{"@data-slot/core":"1.0.2"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/radio-group_1.0.2_1790456424751_0.38208850201013966"}}},"time":{"created":"2026-03-24T15:18:33.744Z","modified":"2026-09-26T21:00:25.162Z","0.2.163":"2026-03-24T15:18:34.006Z","0.2.165":"2026-03-30T09:52:58.481Z","0.2.166":"2026-04-02T14:08:22.509Z","0.2.167":"2026-09-14T12:49:23.649Z","1.0.0":"2026-09-23T09:31:49.526Z","1.0.1":"2026-09-26T07:39:25.153Z","1.0.2":"2026-09-26T21:00:24.849Z"},"bugs":{"url":"https://github.com/bejamas/data-slot/issues"},"license":"MIT","homepage":"https://github.com/bejamas/data-slot#readme","keywords":["headless","ui","radio","radio-group","form","vanilla","data-slot"],"repository":{"url":"git+https://github.com/bejamas/data-slot.git","type":"git","directory":"packages/radio-group"},"description":"Headless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.","maintainers":[{"name":"thomkrupa","email":"thom@bejamas.com"}],"readme":"# @data-slot/radio-group\n\nHeadless radio group component for vanilla JavaScript. Accessible, form-ready, and unstyled.\n\n## Installation\n\n```bash\nbun add @data-slot/radio-group\n# or\nnpm install @data-slot/radio-group\n```\n\n## Usage\n\n### HTML Structure\n\n```html\n<div data-slot=\"radio-group\" data-default-value=\"pro\" data-name=\"plan\">\n  <label>\n    <span data-slot=\"radio-group-item\" data-value=\"starter\">\n      <span data-slot=\"radio-group-indicator\"></span>\n    </span>\n    Starter\n  </label>\n\n  <label>\n    <span data-slot=\"radio-group-item\" data-value=\"pro\">\n      <span data-slot=\"radio-group-indicator\"></span>\n    </span>\n    Pro\n  </label>\n</div>\n```\n\n### JavaScript\n\n```javascript\nimport { create, createRadioGroup } from \"@data-slot/radio-group\";\n\n// Auto-discover and bind all [data-slot=\"radio-group\"] elements\nconst controllers = create();\n\n// Or target a specific element\nconst radioGroup = createRadioGroup(element, {\n  defaultValue: \"pro\",\n  name: \"plan\",\n  required: true,\n  onValueChange: (value) => console.log(\"Selected:\", value),\n});\n\n// Programmatic control\nradioGroup.select(\"enterprise\");\nradioGroup.clear();\nconsole.log(radioGroup.value); // null\n\n// Cleanup\nradioGroup.destroy();\n```\n\n## API\n\n### Initialization\n\n#### `create(scope?)`\n\nFind and bind uninitialized `[data-slot=\"radio-group\"]` descendants of `scope` (defaults to `document`). Returns `RadioGroupController[]` for newly bound roots. To initialize the scope element itself, use `createRadioGroup`.\n\n```typescript\nimport { create } from \"@data-slot/radio-group\";\n\nconst controllers = create();\n```\n\n#### `createRadioGroup(root, options?)`\n\nCreate a `RadioGroupController` for one root element. JavaScript options take precedence over the corresponding data attributes. Calling this again for a bound root returns its existing controller; destroy it before rebinding with new options.\n\n```typescript\nimport { createRadioGroup } from \"@data-slot/radio-group\";\n\nconst controller = createRadioGroup(element, {});\n```\n\n### Slots\n\n#### Runtime Slots\n\n- `radio-group` - Root element that manages the selected value, radio-group semantics, and keyboard navigation.\n- `radio-group-item` - Individual radio control identified by `data-value`; receives checked state and participates in roving focus.\n- `radio-group-indicator` - Optional visual indicator inside an item; receives checked and disabled state for styling.\n\n### Options\n\nOptions can be passed via JavaScript or data attributes (JS takes precedence).\n\n| Option | Data Attribute | Type | Default | Description |\n|--------|---------------|------|---------|-------------|\n| `defaultValue` | `data-default-value` | `string` | `null` | Initially selected value |\n| `name` | `data-name` | `string` | - | Shared form field name for generated radios |\n| `disabled` | `data-disabled` | `boolean` | `false` | Disable user interaction and submission |\n| `readOnly` | `data-read-only` / `data-readOnly` | `boolean` | `false` | Prevent user interaction while keeping programmatic control |\n| `required` | `data-required` | `boolean` | `false` | Require a selected value for native validation |\n| `onValueChange` | - | `(value: string \\| null) => void` | - | Callback fired when selection changes |\n\n### Controller\n\n```typescript\ninterface RadioGroupController {\n  readonly value: string | null;\n  select(value: string): void;\n  clear(): void;\n  destroy(): void;\n}\n```\n\n### Events\n\n#### Outbound Events\n\nListen for these events on the root element.\n\n\n| Event | Detail | Description |\n|-------|--------|-------------|\n| `radio-group:change` | `{ value: string \\| null }` | Fires when the selected value changes |\n\n#### Inbound Events\n\nDispatch these events on the root element.\n\n\n| Event | Detail | Description |\n|-------|--------|-------------|\n| `radio-group:set` | `{ value: string \\| null }` | Select or clear a value programmatically |\n\n```javascript\n// Listen for changes\nroot.addEventListener(\"radio-group:change\", (e) => {\n  console.log(\"Value:\", e.detail.value);\n});\n\n// Set value from outside\nroot.dispatchEvent(\n  new CustomEvent(\"radio-group:set\", {\n    detail: { value: \"pro\" },\n  }),\n);\n\n// Clear selection from outside\nroot.dispatchEvent(\n  new CustomEvent(\"radio-group:set\", {\n    detail: { value: null },\n  }),\n);\n```\n\n**Note:** Inbound events are blocked when the group is disabled or read-only. Controller methods still work.\n\n### Styling\n\nThe controller mirrors Base/shadcn-style presence attributes onto items and indicators:\n\n```css\n[data-slot=\"radio-group-item\"][data-checked] { ... }\n[data-slot=\"radio-group-item\"][data-unchecked] { ... }\n[data-slot=\"radio-group-item\"][data-disabled] { ... }\n[data-slot=\"radio-group-indicator\"][data-checked] { ... }\n[data-slot=\"radio-group-indicator\"][data-unchecked] { ... }\n```\n\nThe root also mirrors the current value:\n\n```css\n[data-slot=\"radio-group\"][data-value=\"pro\"] { ... }\n```\n\n### Keyboard Navigation\n\n| Key | Action |\n|-----|--------|\n| `ArrowRight` / `ArrowDown` | Move to the next enabled item and select it |\n| `ArrowLeft` / `ArrowUp` | Move to the previous enabled item and select it |\n| `Home` | Select the first enabled item |\n| `End` | Select the last enabled item |\n| `Space` / `Enter` | Select the focused item |\n\n### Accessibility\n\n- Root gets `role=\"radiogroup\"` plus `aria-disabled`, `aria-readonly`, and `aria-required`\n- Items get `role=\"radio\"`, `aria-checked`, `aria-disabled`, and roving `tabindex`\n- Disabled items are skipped during keyboard navigation\n- Wrapping labels and `label[for]` associations are mirrored to `aria-labelledby`\n\n#### Labeling Patterns\n\n##### Wrapping Labels\n\n```html\n<label>\n  <span data-slot=\"radio-group-item\" data-value=\"starter\">\n    <span data-slot=\"radio-group-indicator\"></span>\n  </span>\n  Starter\n</label>\n```\n\n##### Sibling `label[for]`\n\n```html\n<label for=\"plan-pro\">Pro</label>\n<span id=\"plan-pro\" data-slot=\"radio-group-item\" data-value=\"pro\">\n  <span data-slot=\"radio-group-indicator\"></span>\n</span>\n```\n\n### Form Integration\n\nThe controller generates one visually hidden native radio input per item. When `name` is provided, those inputs share the same field name and participate in native form submission and reset behavior.\n\n```html\n<form>\n  <div data-slot=\"radio-group\" data-name=\"plan\" data-required>\n    <label>\n      <span data-slot=\"radio-group-item\" data-value=\"starter\"></span>\n      Starter\n    </label>\n    <label>\n      <span data-slot=\"radio-group-item\" data-value=\"pro\"></span>\n      Pro\n    </label>\n  </div>\n</form>\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}