[change] new accessibility features and docs

* Change 'accessible' to align with React Native.
* Add support for 'importantForAccessibility'.
* Stop event propagation for keyboard-activated Touchables (nested
  Touchables now respond the same as when touch-activated).
* Fix whitespace layout of nested Text elements.
* Use 'div' for Text to improve TalkBack grouping.
* Rewrite accessibility docs.

Close #382
Fix #408
This commit is contained in:
Nicolas Gallagher
2017-04-02 16:15:54 -07:00
parent cbd98a8bd7
commit 7705f521c8
31 changed files with 578 additions and 291 deletions

View File

@@ -4,19 +4,19 @@
[...View props](./View.md)
**animating**: bool = true
**animating**: boolean = true
Whether to show the indicator or hide it.
**color**: string = '#1976D2'
**color**: ?color = '#1976D2'
The foreground color of the spinner.
**hidesWhenStopped**: bool = true
**hidesWhenStopped**: ?boolean = true
Whether the indicator should hide when not animating.
**size**: oneOf('small, 'large') | number = 'small'
**size**: ?enum('small, 'large') | number = 'small'
Size of the indicator. Small has a height of `20`, large has a height of `36`.

View File

@@ -6,23 +6,27 @@ build your own custom button using `TouchableOpacity` or
## Props
**accessibilityLabel**: string
**accessibilityLabel**: ?string
Defines the text available to assistive technologies upon interaction with the
element. (This is implemented using `aria-label`.)
Overrides the text that's read by a screen reader when the user interacts
with the element.
**color**: string
**color**: ?string
Background color of the button.
**disabled**: bool = false
**disabled**: ?boolean
If true, disable all interactions for this component
If `true`, disable all interactions for this element.
**onPress**: function
This function is called on press.
testID: ?string
Used to locate this view in end-to-end tests.
**title**: string
Text to display inside the button.

View File

@@ -9,65 +9,66 @@ Unsupported React Native props:
## Props
**accessibilityLabel**: string
**accessibilityLabel**: ?string
The text that's read by a screenreader when someone interacts with the image.
**accessible**: bool
**accessible**: ?boolean
When `false`, the view is hidden from screenreaders. Default: `true`.
When `true`, indicates the image is an accessibility element.
**children**: any
**children**: ?any
Content to display over the image.
**defaultSource**: { uri: string }
**defaultSource**: ?object
An image to display as a placeholder while downloading the final image off the network.
An image to display as a placeholder while downloading the final image off the
network. `{ uri: string, width, height }`
**onError**: function
**onError**: ?function
Invoked on load error with `{nativeEvent: {error}}`.
**onLayout**: function
**onLayout**: ?function
Invoked on mount and layout changes with `{ nativeEvent: { layout: { x, y, width,
height } } }`, where `x` and `y` are the offsets from the parent node.
**onLoad**: function
**onLoad**: ?function
Invoked when load completes successfully.
**onLoadEnd**: function
**onLoadEnd**: ?function
Invoked when load either succeeds or fails,
**onLoadStart**: function
**onLoadStart**: ?function
Invoked on load start.
**resizeMode**: oneOf('center', 'contain', 'cover', 'none', 'repeat', 'stretch') = 'cover'
**resizeMode**: ?enum('center', 'contain', 'cover', 'none', 'repeat', 'stretch') = 'cover'
Determines how to resize the image when the frame doesn't match the raw image
dimensions.
**source**: { uri: string }
**source**: ?object
`uri` is a string representing the resource identifier for the image, which
could be an http address or a base64 encoded image.
could be an http address or a base64 encoded image. `{ uri: string, width, height }`
**style**: style
**style**: ?style
+ ...[View#style](./View.md)
+ `resizeMode`
**testID**: string
**testID**: ?string
Used to locate a view in end-to-end tests.
## Properties
static **resizeMode**: Object
static **resizeMode**: object
Example usage:

View File

@@ -6,18 +6,22 @@ Display an activity progress bar.
[...View props](./View.md)
**color**: string = '#1976D2'
**color**: ?string = '#1976D2'
Color of the progress bar.
**indeterminate**: bool = true
**indeterminate**: ?boolean = true
Whether the progress bar will show indeterminate progress.
**progress**: number
**progress**: ?number
The progress value (between 0 and 1).
(web) **trackColor**: string = 'transparent'
**testID**: ?string
Used to locate this view in end-to-end tests.
(web) **trackColor**: ?string = 'transparent'
Color of the track bar.

View File

@@ -9,17 +9,17 @@ view directly (discouraged) or make sure all parent views have bounded height
[...View props](./View.md)
**contentContainerStyle**: style
**contentContainerStyle**: ?style
These styles will be applied to the scroll view content container which wraps
all of the child views.
**horizontal**: bool = false
**horizontal**: ?boolean = false
When true, the scroll view's children are arranged horizontally in a row
When `true`, the scroll view's children are arranged horizontally in a row
instead of vertically in a column.
**keyboardDismissMode**: oneOf('none', 'on-drag') = 'none'
**keyboardDismissMode**: ?enum('none', 'on-drag') = 'none'
Determines whether the keyboard gets dismissed in response to a scroll drag.
@@ -27,13 +27,13 @@ Determines whether the keyboard gets dismissed in response to a scroll drag.
* `on-drag`, the keyboard is dismissed when a drag begins.
* `interactive` (not supported on web; same as `none`)
**onContentSizeChange**: function
**onContentSizeChange**: ?function
Called when scrollable content view of the `ScrollView` changes. It's
implemented using the `onLayout` handler attached to the content container
which this `ScrollView` renders.
**onScroll**: function
**onScroll**: ?function
Fires at most once per frame during scrolling. The frequency of the events can
be contolled using the `scrollEventThrottle` prop.
@@ -50,18 +50,18 @@ Invoked on scroll with the following event:
}
```
**refreshControl**: element
**refreshControl**: ?element
TODO
A [RefreshControl](../RefreshControl) component, used to provide
pull-to-refresh functionality for the `ScrollView`.
**scrollEnabled**: bool = true
**scrollEnabled**: ?boolean = true
When false, the content does not scroll.
**scrollEventThrottle**: number = 0
**scrollEventThrottle**: ?number = 0
This controls how often the scroll event will be fired while scrolling (as a
time interval in ms). A lower number yields better accuracy for code that is

View File

@@ -9,31 +9,31 @@ supplied `value` prop instead of the expected result of any user actions.
[...View props](./View.md)
**disabled**: bool = false
**disabled**: ?boolean = false
If `true` the user won't be able to interact with the switch.
**onValueChange**: func
**onValueChange**: ?function
Invoked with the new value when the value changes.
**value**: bool = false
**value**: ?boolean = false
The value of the switch. If `true` the switch will be turned on.
(web) **activeThumbColor**: color = #009688
(web) **activeThumbColor**: ?color = #009688
The color of the thumb grip when the switch is turned on.
(web) **activeTrackColor**: color = #A3D3CF
(web) **activeTrackColor**: ?color = #A3D3CF
The color of the track when the switch is turned on.
(web) **thumbColor**: color = #FAFAFA
(web) **thumbColor**: ?color = #FAFAFA
The color of the thumb grip when the switch is turned off.
(web) **trackColor**: color = #939393
(web) **trackColor**: ?color = #939393
The color of the track when the switch is turned off.

View File

@@ -16,49 +16,62 @@ Unsupported React Native props:
NOTE: `Text` will transfer all other props to the rendered HTML element.
(web) **accessibilityLabel**: string
(web) **accessibilityLabel**: ?string
Defines the text available to assistive technologies upon interaction with the
element. (This is implemented using `aria-label`.)
Overrides the text that's read by a screen reader when the user interacts
with the element. (This is implemented using `aria-label`.)
(web) **accessibilityRole**: oneOf(roles)
See the [Accessibility guide](../guides/accessibility) for more information.
(web) **accessibilityRole**: ?oneOf(roles)
Allows assistive technologies to present and support interaction with the view
in a manner that is consistent with user expectations for similar views of that
type. For example, marking a touchable view with an `accessibilityRole` of
`button`. (This is implemented using [ARIA roles](http://www.w3.org/TR/wai-aria/roles#role_definitions)).
Note: Avoid changing `accessibilityRole` values over time or after user
actions. Generally, accessibility APIs do not provide a means of notifying
assistive technologies of a `role` value change.
See the [Accessibility guide](../guides/accessibility) for more information.
**accessible**: bool = true
**accessible**: ?boolean
When `false`, the text is hidden from assistive technologies. (This is
implemented using `aria-hidden`.)
When `true`, indicates that the view is an accessibility element (i.e.,
focusable) and groups its child content. By default, all the touchable elements
and elements with `accessibilityRole` of `button` and `link` are accessible.
(This is implemented using `tabindex`.)
**children**: any
See the [Accessibility guide](../guides/accessibility) for more information.
**children**: ?any
Child content.
**numberOfLines**: number
**importantForAccessibility**: ?enum('auto', 'no-hide-descendants', 'yes')
A value of `no` will remove the element from the tab flow.
A value of `no-hide-descendants` will hide the element and its children from
assistive technologies. (This is implemented using `aria-hidden`.)
See the [Accessibility guide](../guides/accessibility) for more information.
**numberOfLines**: ?number
Truncates the text with an ellipsis after this many lines. Currently only supports `1`.
**onLayout**: function
**onLayout**: ?function
Invoked on mount and layout changes with `{ nativeEvent: { layout: { x, y, width,
height } } }`, where `x` and `y` are the offsets from the parent node.
**onPress**: function
**onPress**: ?function
This function is called on press.
**selectable**: bool = true
**selectable**: ?boolean
Lets the user select the text.
When `false`, the text is not selectable.
**style**: style
**style**: ?style
+ ...[View#style](View.md)
+ `color`
@@ -85,7 +98,7 @@ Lets the user select the text.
‡ web only.
**testID**: string
**testID**: ?string
Used to locate this view in end-to-end tests.

View File

@@ -18,7 +18,7 @@ Unsupported React Native props:
[...View props](./View.md)
**autoCapitalize**: oneOf('characters', 'none', 'sentences', 'words') = 'sentences'
**autoCapitalize**: ?enum('characters', 'none', 'sentences', 'words') = 'sentences'
Automatically capitalize certain characters (only available in Chrome and iOS Safari).
@@ -27,21 +27,21 @@ Automatically capitalize certain characters (only available in Chrome and iOS Sa
* `sentences`: Automatically capitalize the first letter of sentences.
* `words`: Automatically capitalize the first letter of words.
(web) **autoComplete**: string
(web) **autoComplete**: ?string
Indicates whether the value of the control can be automatically completed by
the browser. [Accepted values](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input).
**autoCorrect**: bool = true
**autoCorrect**: ?boolean = true
Automatically correct spelling mistakes (only available in iOS Safari).
**autoFocus**: bool = false
**autoFocus**: ?boolean = false
If `true`, focuses the input on `componentDidMount`. Only the first form element
in a document with `autofocus` is focused.
**blurOnSubmit**: bool
**blurOnSubmit**: ?boolean
If `true`, the text field will blur when submitted. The default value is `true`
for single-line fields and `false` for multiline fields. Note, for multiline
@@ -49,104 +49,104 @@ fields setting `blurOnSubmit` to `true` means that pressing return will blur
the field and trigger the `onSubmitEditing` event instead of inserting a
newline into the field.
**clearTextOnFocus**: bool = false
**clearTextOnFocus**: ?boolean = false
If `true`, clears the text field automatically when focused.
**defaultValue**: string
**defaultValue**: ?string
Provides an initial value that will change when the user starts typing. Useful
for simple use-cases where you don't want to deal with listening to events and
updating the `value` prop to keep the controlled state in sync.
**editable**: bool = true
**editable**: ?boolean = true
If `false`, text is not editable (i.e., read-only).
**keyboardType**: oneOf('default', 'email-address', 'numeric', 'phone-pad', 'search', 'url', 'web-search') = 'default'
**keyboardType**: enum('default', 'email-address', 'numeric', 'phone-pad', 'search', 'url', 'web-search') = 'default'
Determines which keyboard to open. (NOTE: Safari iOS requires an ancestral
`<form action>` element to display the `search` keyboard).
(Not available when `multiline` is `true`.)
**maxLength**: number
**maxLength**: ?number
Limits the maximum number of characters that can be entered.
**multiline**: bool = false
**multiline**: ?boolean = false
If true, the text input can be multiple lines.
**numberOfLines**: number = 2
**numberOfLines**: ?number = 2
Sets the number of lines for a multiline `TextInput`.
(Requires `multiline` to be `true`.)
**onBlur**: function
**onBlur**: ?function
Callback that is called when the text input is blurred.
**onChange**: function
**onChange**: ?function
Callback that is called when the text input's text changes.
**onChangeText**: function
**onChangeText**: ?function
Callback that is called when the text input's text changes. The text is passed
as an argument to the callback handler.
**onFocus**: function
**onFocus**: ?function
Callback that is called when the text input is focused.
**onKeyPress**: function
**onKeyPress**: ?function
Callback that is called when a key is pressed. Pressed key value is passed as
an argument to the callback handler. Fires before `onChange` callbacks.
**onSelectionChange**: function
**onSelectionChange**: ?function
Callback that is called when the text input's selection changes. This will be called with
`{ nativeEvent: { selection: { start, end } } }`.
**onSubmitEditing**: function
**onSubmitEditing**: ?function
Callback that is called when the keyboard's submit button is pressed.
**placeholder**: string
**placeholder**: ?string
The string that will be rendered in an empty `TextInput` before text has been
entered.
**secureTextEntry**: bool = false
**secureTextEntry**: ?boolean = false
If true, the text input obscures the text entered so that sensitive text like
passwords stay secure.
(Not available when `multiline` is `true`.)
**selection**: { start: number, end: ?number }
**selection**: ?{ start: number, end: ?number }
The start and end of the text input's selection. Set start and end to the same value to position the cursor.
**selectTextOnFocus**: bool = false
**selectTextOnFocus**: ?boolean = false
If `true`, all text will automatically be selected on focus.
**style**: style
**style**: ?style
+ ...[Text#style](./Text.md)
+ `resize`
‡ web only.
**testID**: string
**testID**: ?string
Used to locate this view in end-to-end tests.
**value**: string
**value**: ?string
The value to show for the text input. `TextInput` is a controlled component,
which means the native `value` will be forced to match this prop if provided.

View File

@@ -11,58 +11,33 @@ several child components, wrap them in a View.
[...View props](./View.md)
**accessibilityLabel**: string
Overrides the text that's read by the screen reader when the user interacts
with the element.
(web) **accessibilityRole**: oneOf(roles) = 'button'
Allows assistive technologies to present and support interaction with the view
**accessible**: bool = true
When `false`, the view is hidden from screenreaders.
**children**: View
**delayLongPress**: number
**delayLongPress**: ?number
Delay in ms, from `onPressIn`, before `onLongPress` is called.
**delayPressIn**: number
**delayPressIn**: ?number
Delay in ms, from the start of the touch, before `onPressIn` is called.
**delayPressOut**: number
**delayPressOut**: ?number
Delay in ms, from the release of the touch, before `onPressOut` is called.
**disabled**: bool
**disabled**: ?boolean
If true, disable all interactions for this component.
If `true`, disable all interactions for this component.
**hitSlop**: `{top: number, left: number, bottom: number, right: number}`
**onLongPress**: ?function
This defines how far your touch can start away from the button. This is added
to `pressRetentionOffset` when moving off of the button.
**onLayout**: function
Invoked on mount and layout changes with `{ nativeEvent: { layout: { x, y, width,
height } } }`, where `x` and `y` are the offsets from the parent node.
**onLongPress**: function
**onPress**: function
**onPress**: ?function
Called when the touch is released, but not if cancelled (e.g. by a scroll that steals the responder lock).
**onPressIn**: function
**onPressIn**: ?function
**onPressOut**: function
**onPressOut**: ?function
**pressRetentionOffset**: `{top: number, left: number, bottom: number, right: number}`
**pressRetentionOffset**: ?`{top: number, left: number, bottom: number, right: number}`
When the scroll view is disabled, this defines how far your touch may move off
of the button, before deactivating the button. Once deactivated, try moving it

View File

@@ -7,23 +7,20 @@ inside another `View` and has 0-to-many children of any type.
Also, refer to React Native's documentation about the [Gesture Responder
System](http://facebook.github.io/react-native/releases/0.22/docs/gesture-responder-system.html).
Unsupported React Native props:
`onAccessibilityTap`,
`hitSlop`,
`onMagicTap`
Unsupported React Native props: `collapsable`, `onAccessibilityTap`, `onMagicTap`.
## Props
NOTE: `View` will transfer all other props to the rendered HTML element.
**accessibilityLabel**: string
**accessibilityLabel**: ?string
Overrides the text that's read by the screen reader when the user interacts
with the element. By default, the label is constructed by traversing all the
children and accumulating all the `Text` nodes separated by space. (This is
implemented using `aria-label`.)
Overrides the text that's read by a screen reader when the user interacts
with the element. (This is implemented using `aria-label`.)
**accessibilityLiveRegion**: oneOf('assertive', 'off', 'polite') = 'off'
See the [Accessibility guide](../guides/accessibility) for more information.
**accessibilityLiveRegion**: ?enum('assertive', 'none', 'polite')
Indicates to assistive technologies whether to notify the user when the view
changes. The values of this attribute are expressed in degrees of importance.
@@ -32,64 +29,105 @@ priority. When regions are specified as `assertive`, assistive technologies
will interrupt and immediately notify the user. (This is implemented using
[`aria-live`](http://www.w3.org/TR/wai-aria/states_and_properties#aria-live).)
(web) **accessibilityRole**: oneOf(roles)
See the [Accessibility guide](../guides/accessibility) for more information.
(web) **accessibilityRole**: ?enum(roles)
Allows assistive technologies to present and support interaction with the view
in a manner that is consistent with user expectations for similar views of that
type. For example, marking a touchable view with an `accessibilityRole` of
`button`. (This is implemented using [ARIA roles](http://www.w3.org/TR/wai-aria/roles#role_definitions)).
Note: Avoid changing `accessibilityRole` values over time or after user
actions. Generally, accessibility APIs do not provide a means of notifying
assistive technologies of a `role` value change.
See the [Accessibility guide](../guides/accessibility) for more information.
**accessible**: bool = true
**accessible**: ?boolean
When `false`, the view is hidden from assistive technologies. (This is
implemented using `aria-hidden`.)
When `true`, indicates that the view is an accessibility element (i.e.,
focusable) and groups its child content. By default, all the touchable elements
and elements with `accessibilityRole` of `button` and `link` are accessible.
(This is implemented using `tabindex`.)
**hitSlop**: {top: number, left: number, bottom: number, right: number}
See the [Accessibility guide](../guides/accessibility) for more information.
This defines how far a touch event can start away from the view. Typical
interface guidelines recommend touch targets that are at least 30 - 40
**children**: ?element
Child content.
**hitSlop**: ?object
This defines how far a touch event can start away from the view (in pixels).
Typical interface guidelines recommend touch targets that are at least 30 - 40
points/density-independent pixels.
For example, if a touchable view has a height of 20 the touchable height can be
extended to 40 with `hitSlop={{top: 10, bottom: 10, left: 0, right: 0}}`.
For example, if a touchable view has a height of `20` the touchable height can
be extended to `40` with `hitSlop={{top: 10, bottom: 10, left: 0, right: 0}}`.
**onLayout**: function
**importantForAccessibility**: ?enum('auto', 'no', 'no-hide-descendants', 'yes')
A value of `no` will remove the element from the tab flow.
A value of `no-hide-descendants` will hide the element and its children from
assistive technologies. (This is implemented using `aria-hidden`.)
See the [Accessibility guide](../guides/accessibility) for more information.
**onLayout**: ?function
Invoked on mount and layout changes with `{ nativeEvent: { layout: { x, y, width,
height } } }`, where `x` and `y` are the offsets from the parent node.
**onMoveShouldSetResponder**: function
**onMoveShouldSetResponder**: ?function => boolean
**onMoveShouldSetResponderCapture**: function
Does this view want to "claim" touch responsiveness? This is called for every
touch move on the `View` when it is not the responder.
**onResponderGrant**: function
**onMoveShouldSetResponderCapture**: ?function => boolean
For most touch interactions, you'll simply want to wrap your component in
`TouchableHighlight` or `TouchableOpacity`.
If a parent `View` wants to prevent a child `View` from becoming responder on a
move, it should have this handler return `true`.
**onResponderMove**: function
**onResponderGrant**: ?function
**onResponderReject**: function
The `View` is now responding to touch events. This is the time to highlight and
show the user what is happening. For most touch interactions, you'll simply
want to wrap your component in `TouchableHighlight` or `TouchableOpacity`.
**onResponderRelease**: function
**onResponderMove**: ?function
**onResponderTerminate**: function
The user is moving their finger.
**onResponderTerminationRequest**: function
**onResponderReject**: ?function
**onStartShouldSetResponder**: function
Another responder is already active and will not release it to the `View`
asking to be the responder.
**onStartShouldSetResponderCapture**: function
**onResponderRelease**: ?function
**pointerEvents**: oneOf('auto', 'box-only', 'box-none', 'none') = 'auto'
Fired at the end of the touch.
Configure the `pointerEvents` of the view. The enhanced `pointerEvents` modes
provided are not part of the CSS spec, therefore, `pointerEvents` is excluded
from `style`.
**onResponderTerminate**: ?function
The responder has been taken from the `View`.
**onResponderTerminationRequest**: ?function
Some other `View` wants to become responder and is asking this `View` to
release its responder. Returning `true` allows its release.
**onStartShouldSetResponder**: ?function => boolean
Does this view want to become responder on the start of a touch?
**onStartShouldSetResponderCapture**: ?function => boolean
If a parent `View` wants to prevent a child `View` from becoming the responder
on a touch start, it should have this handler return `true`.
**pointerEvents**: ?enum('auto', 'box-only', 'box-none', 'none') = 'auto'
Controls whether the View can be the target of touch events. The enhanced
`pointerEvents` modes provided are not part of the CSS spec, therefore,
`pointerEvents` is excluded from `style`.
`box-none` is the equivalent of:
@@ -105,7 +143,7 @@ from `style`.
.box-only * { pointer-events: none }
```
**style**: style
**style**: ?style
+ `alignContent`
+ `alignItems`
@@ -151,7 +189,7 @@ from `style`.
+ `boxShadow`
+ `boxSizing`
+ `cursor`
+ `display`
+ `display`
+ `flex` (number)
+ `flexBasis`
+ `flexDirection`
@@ -224,7 +262,7 @@ Default:
(See [facebook/css-layout](https://github.com/facebook/css-layout)).
**testID**: string
**testID**: ?string
Used to locate this view in end-to-end tests.