UNPKG

svelte-radio

Version:

Declarative Radio button group component for Svelte

157 lines (106 loc) 3.16 kB
# svelte-radio [![NPM][npm]][npm-url] > Declarative Radio button group component for Svelte. <!-- REPO_URL --> Try it in the [Svelte REPL](https://svelte.dev/repl/f2b10d0faf2e44fd85a72b06a63ae8c2). --- <!-- TOC --> ## Installation **Yarn** ```bash yarn add -D svelte-radio ``` **NPM** ```bash npm i -D svelte-radio ``` **pnpm** ```bash pnpm i -D svelte-radio ``` ## Usage By default, this component is _unstyled_. ### Basic ```svelte <script> import { RadioGroup, Radio } from "svelte-radio"; let value = "1"; </script> <RadioGroup bind:value label="Radio group legend"> <Radio label="Label 1" value="1" /> <Radio label="Label 2" value="2" /> <Radio label="Label 3" value="3" /> </RadioGroup> value: {value} <br /> <button on:click={() => (value = "2")}>Set value to "2"</button> ``` ### Custom legend Customize the radio group legend by using the "legend" slot: ```svelte <RadioGroup bind:value> <span slot="legend"> <legend style="color: red">Radio group legend</legend> </span> <Radio label="Label 1" value="1" /> <Radio label="Label 2" value="2" /> <Radio label="Label 3" value="3" /> </RadioGroup> ``` ### Styling This component is unstyled by design. Use a global class selector to style the `.svelte-radio-group` and `.svelte-radio` classes. ```css :global(.svelte-radio-group) { border: 2px solid #e0e0e0; padding: 1rem; } :global(.svelte-radio) { margin-bottom: 0.5rem; } :global(.svelte-radio label) { margin-left: 0.25rem; } ``` ## API ### `RadioGroup` props | Name | Type | Default value | | :----- | :------------------- | :--------------------- | | legend | `string` | `"Radio group legend"` | | value | `string` or `number` | `undefined` | `$$restProps` are forwarded to the top-level `fieldset` element. ### `Radio` props | Name | Type | Default value | | :------ | :------------------- | :-------------------------------------- | | id | `string` | `"radio-" + Math.random().toString(36)` | | label | `string` | `"Radio button label"` | | value | `string` or `number` | `""` | | checked | `boolean` | `false` | `$$restProps` are forwarded to the second-level `input` element. ## Dispatched events ### `RadioGroup` - **on:change**: dispatched when the selection changes ```svelte <script> let events = []; </script> <RadioGroup value="1" label="Radio group legend" on:change={(e) => (events = [...events, e.detail])} > <Radio label="Label 1" value="1" /> <Radio label="Label 2" value="2" /> <Radio label="Label 3" value="3" /> </RadioGroup> {#each events as event} <pre>{JSON.stringify(event, null, 2)}</pre> {/each} ``` ## TypeScript Svelte version 3.31 or greater is required to use this component with TypeScript. ## Changelog [Changelog](CHANGELOG.md) ## License [MIT](LICENSE) [npm]: https://img.shields.io/npm/v/svelte-radio.svg?color=%23ff3e00&style=for-the-badge [npm-url]: https://npmjs.com/package/svelte-radio