Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
6221077
refactor(radio-button): merge platform variants into one MD3 component
burczu Jun 19, 2026
a155b74
feat(radio-button): add MD3 tokens, error state, single animation path
burczu Jun 19, 2026
015baf4
perf(radio-button): memoize group context, switch to useContext
burczu Jun 19, 2026
9649647
fix(radio-button): single a11y node per item, error + parity cleanup
burczu Jun 19, 2026
9e4a668
docs(radio-button): update example + drop platform variant docs
burczu Jun 19, 2026
d9f3973
fix(radio-button): apply disabled opacity, animate group selection
burczu Jun 19, 2026
ee00e84
docs(radio-button): dim disabled labels, add unchecked error examples
burczu Jun 19, 2026
c0e1c18
refactor(radio-button): migrate dot animation to reanimated
burczu Jun 19, 2026
e486e99
fix(radio-button): fix post-rebase CI failures
burczu Jul 2, 2026
2b4eebb
fix(radio-button): fix prettier formatting in utils.ts
burczu Jul 2, 2026
1d1ea02
docs(radio-button): drop deleted pages from _meta.json
burczu Jul 2, 2026
3c226a1
docs(radio-button): remove deleted components from docs config
burczu Jul 2, 2026
ea2a6e9
fix(radio-button): address PR review comments
burczu Jul 3, 2026
a1a3e75
fix: prevent nested item control from receiving focus
MikitasK Aug 24, 2026
feb9a54
fix: use 40dp MD3 state layer
MikitasK Aug 24, 2026
5554631
Merge branch 'main' of https://github.com/callstack/react-native-pape…
MikitasK Aug 24, 2026
12644a8
refactor: address review feedback
MikitasK Aug 25, 2026
e0366bc
docs: add v6 migration guidance
MikitasK Aug 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 0 additions & 99 deletions docs/6.x/docs/components/RadioButton/RadioButtonAndroid.mdx

This file was deleted.

91 changes: 0 additions & 91 deletions docs/6.x/docs/components/RadioButton/RadioButtonIOS.mdx

This file was deleted.

8 changes: 0 additions & 8 deletions docs/6.x/docs/components/RadioButton/RadioButtonItem.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -171,14 +171,6 @@ export default MyComponent;

<div>

### mode

</div>

<PropTable componentLink="RadioButton/RadioButtonItem" prop="mode" />

<div>

### position

</div>
Expand Down
2 changes: 0 additions & 2 deletions docs/6.x/docs/components/RadioButton/_meta.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
[
"RadioButton",
"RadioButtonAndroid",
"RadioButtonGroup",
"RadioButtonIOS",
"RadioButtonItem"
]
16 changes: 16 additions & 0 deletions docs/6.x/docs/guides/migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@ TBC

## Components

### RadioButton

`RadioButton` renders one Material 3 circular radio control on every platform. The platform-specific components and their prop types are gone. On iOS checked controls no longer render a checkmark; they use the same ring-and-dot indicator as other platforms. `RadioButton` now also forwards `TouchableRipple` props (`accessible`, `onFocus`, `onBlur`, `borderless`, `rippleColor`, ...).

| v5 | v6 |
| ------------------------------------------------ | ----------------------------------------------------------------------- |
| `RadioButton.Android`, `RadioButton.IOS` | `RadioButton` |
| `RadioButtonAndroidProps`, `RadioButtonIOSProps` | `RadioButtonProps` |
| `RadioButton.Item` `mode="android" \| "ios"` | `mode` removed; `RadioButton.Item` always renders `RadioButton` |
| n/a | new `error` (uses `theme.colors.error`) and `style` (state-layer style) |

```diff
- <RadioButton.IOS value="first" status="checked" onPress={select} />
+ <RadioButton value="first" status="checked" onPress={select} />
```

### TextInput

The Paper 6.x `TextInput` is a complete rewrite with a new API. Import the component the same way, but note that the props and behavior have changed significantly.
Expand Down
2 changes: 0 additions & 2 deletions docs/component-docs.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -110,9 +110,7 @@ const pages = {
ProgressBar: 'ProgressBar',
RadioButton: {
RadioButton: 'RadioButton/RadioButton',
RadioButtonAndroid: 'RadioButton/RadioButtonAndroid',
RadioButtonGroup: 'RadioButton/RadioButtonGroup',
RadioButtonIOS: 'RadioButton/RadioButtonIOS',
RadioButtonItem: 'RadioButton/RadioButtonItem',
},
Searchbar: 'Searchbar',
Expand Down
46 changes: 30 additions & 16 deletions example/src/Examples/RadioButtonExample.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {

import ScreenWrapper from '../ScreenWrapper';

type State = 'normal' | 'normal-ios' | 'normal-item' | 'custom';
type State = 'normal' | 'normal-item' | 'custom';

const RadioButtonExample = () => {
const [checked, setChecked] = React.useState<State>('normal');
Expand All @@ -19,26 +19,15 @@ const RadioButtonExample = () => {
<ScreenWrapper style={styles.container}>
<TouchableRipple onPress={() => setChecked('normal')}>
<View style={styles.row}>
<Text>Normal - Material Design</Text>
<Text>Normal</Text>
<View pointerEvents="none">
<RadioButton.Android
<RadioButton
value="normal"
status={checked === 'normal' ? 'checked' : 'unchecked'}
/>
</View>
</View>
</TouchableRipple>
<TouchableRipple onPress={() => setChecked('normal-ios')}>
<View style={styles.row}>
<Text>Normal 2 - IOS</Text>
<View pointerEvents="none">
<RadioButton.IOS
value="normal-ios"
status={checked === 'normal-ios' ? 'checked' : 'unchecked'}
/>
</View>
</View>
</TouchableRipple>
<TouchableRipple onPress={() => setChecked('custom')}>
<View style={styles.row}>
<Text>Custom</Text>
Expand All @@ -58,11 +47,31 @@ const RadioButtonExample = () => {
onPress={() => setChecked('normal-item')}
/>
<View style={styles.row}>
<Text>Checked (Disabled)</Text>
<Text>Error (Checked)</Text>
<RadioButton value="error" status="checked" error />
</View>
<View style={styles.row}>
<Text>Error (Unchecked)</Text>
<RadioButton value="error-unchecked" status="unchecked" error />
</View>
<RadioButton.Item
label="Error - Item (Checked)"
value="error-item"
status="checked"
error
/>
<RadioButton.Item
label="Error - Item (Unchecked)"
value="error-item-unchecked"
status="unchecked"
error
/>
<View style={styles.row}>
<Text style={styles.disabledLabel}>Checked (Disabled)</Text>
<RadioButton value="first" status="checked" disabled />
</View>
<View style={styles.row}>
<Text>Unchecked (Disabled)</Text>
<Text style={styles.disabledLabel}>Unchecked (Disabled)</Text>
<RadioButton value="second" status="unchecked" disabled />
</View>
<RadioButton.Item
Expand Down Expand Up @@ -94,6 +103,11 @@ const styles = StyleSheet.create({
paddingVertical: 8,
paddingHorizontal: 16,
},
// Standalone RadioButton has no label of its own; dim the demo label to
// match the disabled control (RadioButton.Item dims its label for you).
disabledLabel: {
opacity: 0.38,
},
});

export default RadioButtonExample;
4 changes: 2 additions & 2 deletions example/src/Examples/RadioButtonGroupExample.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@ const RadioButtonGroupExample = () => {
</View>
<View style={styles.row}>
<Text>Second</Text>
<RadioButton.Android value="second" />
<RadioButton value="second" />
</View>
<View style={styles.row}>
<Text>Third</Text>
<RadioButton.IOS value="third" />
<RadioButton value="third" />
</View>
</RadioButton.Group>
</List.Section>
Expand Down
Loading