You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/accessibility-keyboard-navigation.md
+6-6Lines changed: 6 additions & 6 deletions
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@ author: hemantgaur
5
5
6
6
ms.topic: article
7
7
ms.custom: canvas
8
-
ms.date: 09/06/2021
8
+
ms.date: 07/12/2024
9
9
ms.subservice: canvas-maker
10
10
ms.author: hemantg
11
11
search.audienceType:
@@ -24,7 +24,7 @@ contributors:
24
24
> - This is an experimental feature, and will be deprecated soon. Instead of using this experimental feature, consider [structuring an app appropriately](accessible-apps-structure.md#logical-control-order) to achieve the desired tab navigation order.
25
25
> - Experimental features aren’t meant for production use and may have restricted functionality. These features are available before an official release so that customers can get early access and provide feedback.
26
26
27
-
When you're nesting controls such as containers and component instances, the user input value for [TabIndex](controls/properties-accessibility.md#tabindex) isn't respected sometimes. **Improved canvas keyboard navigation** experimental setting improves the navigation experience in this situation when **Tab** key is pressed on the keyboard helping focus on the desired container or control precisely and predictably.
27
+
When you're nesting controls such as containers and component instances, the user input value for [TabIndex](controls/properties-accessibility.md#acceptsfocus-and-tabindex) isn't respected sometimes. **Improved canvas keyboard navigation** experimental setting improves the navigation experience in this situation when **Tab** key is pressed on the keyboard helping focus on the desired container or control precisely and predictably.
28
28
29
29
This feature also adds support for handling accessibility for keyboard tabs inline with rest of the controls in canvas apps. And addresses manual TabIndex assignments for all controls.
30
30
@@ -36,13 +36,13 @@ When this feature is turned on, it also enables the following boolean properties
36
36
| Property Name | Description |
37
37
| - | - |
38
38
|**Prioritize child controls**| Determines the order of navigation (**Z-order**) for child controls on canvas when pressing tab key on the keyboard. <ul> <li> **On** (Default): Pressing the tab key on the keyboard will first progress through all child controls before moving the focus outside of the selected container or component instance. This option is recommended for similarly nested HTML elements. </li> <li> **Off**: Pressing the tab key on the keyboard will progress through all controls only based on Z-order, ignoring parent-child relationship between controls or containers for keyboard navigation. </li> </ul> **Note**: This property isn't applicable to [responsive or autolayout](create-responsive-layout.md) containers. |
39
-
|**Enable child control focus**| Determines the value of [TabIndex](controls/properties-accessibility.md#tabindex) for child controls on canvas when pressing tab key on the keyboard. <ul> <li> **On** (Default): Pressing the tab key behaves as per TabIndex values defined on each control. </li> <li> **Off**: Pressing the tab key doesn't move focus to any child control within the selected container or component instance. Sets the TabIndex value to **-1** for all child controls. </li> </ul> |
39
+
|**Enable child control focus**| Determines the value of [TabIndex](controls/properties-accessibility.md#acceptsfocus-and-tabindex) for child controls on canvas when pressing tab key on the keyboard. <ul> <li> **On** (Default): Pressing the tab key behaves as per TabIndex values defined on each control. </li> <li> **Off**: Pressing the tab key doesn't move focus to any child control within the selected container or component instance. Sets the TabIndex value to **-1** for all child controls. </li> </ul> |
40
40
41
41
## Configure improved canvas keyboard navigation in your app
42
42
43
43
If not already enabled, follow these steps to enable this feature in your app, and set the properties mentioned earlier.
44
44
45
-
1. Sign in to [Power Apps](https://make.poweraps.com).
45
+
1. Sign in to [Power Apps](https://make.powerapps.com).
46
46
47
47
1. Select **Apps** from the left-pane.
48
48
@@ -66,7 +66,7 @@ Now that you understand the new feature with improved canvas keyboard navigation
The following example shows multiple Text input controls, and several nesting scenarios. The number displayed in the input represents the value of the [TabIndex](controls/properties-accessibility.md#tabindex) property. There are two nested containers, and component controls overlaid on top of each other.
69
+
The following example shows multiple Text input controls, and several nesting scenarios. The number displayed in the input represents the value of the [TabIndex](controls/properties-accessibility.md#acceptsfocus-and-tabindex) property. There are two nested containers, and component controls overlaid on top of each other.
70
70
71
71
The default order is determined by the relative position of the controls. When focus enters a container or a component, tabs first traverse the children of the container before moving on to the next available control.
72
72
@@ -80,7 +80,7 @@ In the following example, each container and component control has the **Priorit
80
80
81
81
### Advanced configuration with mixed settings
82
82
83
-
In the following example, the orange outlined containers have **Prioritize child controls** property set to "Off". All others controls have this property set to "On". Also, a custom [TabIndex](controls/properties-accessibility.md#tabindex) property has been set for some inputs, indicated by the number shown in each input.
83
+
In the following example, the orange outlined containers have **Prioritize child controls** property set to "Off". All others controls have this property set to "On". Also, a custom [TabIndex](controls/properties-accessibility.md#acceptsfocus-and-tabindex) property has been set for some inputs, indicated by the number shown in each input.
84
84
85
85
Tab order first proceeds through the containers and controls with TabIndex value of greater than 0, and then proceeds through all others with value of 0. This behavior was also the in the earlier implementation.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/accessible-apps-structure.md
+31-32Lines changed: 31 additions & 32 deletions
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,7 @@ author: tahoon-ms
5
5
6
6
ms.topic: article
7
7
ms.custom: canvas
8
-
ms.date: 09/16/2022
8
+
ms.date: 07/12/2024
9
9
ms.subservice: canvas-maker
10
10
ms.author: tahoon
11
11
ms.reviewer: mkaur
@@ -90,18 +90,42 @@ In this example, a **Gallery** row has a thumbnail and two pieces of text on the
90
90
91
91
## Logical keyboard navigation order
92
92
93
-
**[TabIndex](controls/properties-accessibility.md)** specifies how controls can be reached by keyboard users. **TabIndex** should either be 0 or -1. With a logical control order as described above, there's little reason to have **TabIndex** greater than 0.
93
+
Keyboard navigation is an important aspect of any app. For many, the keyboard is more efficient than using touch or a mouse. The navigation order should:
94
+
- Follow the visual flow of controls.
95
+
- Follow either an intuitive across and then down "Z" order or a down and then across "reverse-N" order.
96
+
- Only have a tab stop at controls that are interactive.
94
97
95
-
Keyboard navigation order should follow visual flow of controls. If the navigation order is unexpected, you should first check if the app structure is logical.
98
+
**[AcceptsFocus](controls/properties-accessibility.md)** specifies whether controls can be reached by keyboard. For classic controls, the equivalent property is **[TabIndex](controls/properties-accessibility.md)**.
99
+
100
+
Navigation order follows [control order](#logical-control-order): from left-to-right, then top-to-bottom, in a "Z" pattern. You can customize it the same way as with control order. For example, controls in **[Containers](controls/control-container.md)**, **[Form Cards](controls/control-card.md)** and **[Galleries](controls/control-gallery.md)** are automatically grouped. The Tab key will navigate through all elements inside the container before proceeding to the next control outside of the container.
101
+
102
+
If the navigation order is unexpected, you should first check if the app structure is logical.
96
103
97
104
> [!NOTE]
98
-
> Keyboard navigation order is not the same as control order. **TabIndex** only affects Tab key navigation. It does not change how screen reader users navigate an app linearly. Some screen reader users don't even use keyboards.
105
+
> When controls are dynamically moved on the screen, for example, by having its **X** or **Y** value change according to a Power Fx expression, the navigation order will not be updated.
106
+
107
+
108
+
### Workaround for custom tab sequence
109
+
110
+
For rare scenarios where the keyboard navigation order should be different from visual order, you can position container controls carefully to have the same effect.
111
+
112
+
In the example below, button A is above button B. The natural tab navigation order is A, then B.
113
+
114
+
:::image type="content" source="media/accessible-apps-structure/simplified-tab-index-workaround-normal.png" alt-text="Two buttons with the same TabIndex, stacked vertically.":::
115
+
116
+
To reverse the tab navigation order, put B in a Container control. Set the Y value of the Container to be above A. The app structure now has the Container (and B) before A. Hence, the tab navigation order is B, then A.
117
+
118
+
:::image type="content" source="media/accessible-apps-structure/simplified-tab-index-workaround-container.png" alt-text="B is put in a container that appears before A.":::
119
+
120
+
With this technique, screen reader users will also encounter B before A when navigating without the **Tab** key.
121
+
122
+
### Custom tab indexes (retired feature)
99
123
100
-
### Avoid custom tab indexes
124
+
Custom tab indexes are those that are greater than zero. They are no longer supported. All **TabIndex** values greater than zero will be treated as zero.
101
125
102
-
Custom tab indexes are those that are greater than zero. They're almost always a sign of bad design. There are better alternatives like creating an appropriate app structure or using **[SetFocus](/power-platform/power-fx/reference/function-setfocus)** to change focus.
126
+
Custom tab indexes are almost always a sign of bad design. There are better alternatives like creating an appropriate app structure or using **[SetFocus](/power-platform/power-fx/reference/function-setfocus)** to change focus.
103
127
104
-
Avoid using custom tab indexes because of the following reasons.
128
+
Some problems with custom tab indexes:
105
129
106
130
#### Accessibility
107
131
It's a serious accessibility issue to have custom tab indexes. Screen reader users navigate an app using its logical structure. Custom tab indexes ignore that structure. Since screen reader users can also navigate using **Tab** key, they'll be confused when they get a different order from other methods of navigation.
@@ -120,31 +144,6 @@ Custom tab indexes only work with built-in controls. Controls that aren't integr
120
144
121
145
In the other direction, when canvas apps are embedded in another web page, custom tab indexes don't work. For example, in [custom pages](../model-driven-apps/model-app-page-overview.md). Power Apps can't control the elements outside the canvas app, so the overall tab navigation order will be illogical.
122
146
123
-
### Simplified tab index (preview)
124
-
125
-
To ensure that tab indexes are either 0 or -1, enable the app feature **Simplified tab index** from **Settings** > **Upcoming features**.
126
-
127
-
:::image type="content" source="media/accessible-apps-structure/simplified-tab-index-setting.png" alt-text="Enabling the Simplified tab index app feature.":::
When this feature is enabled, all **TabIndex** values greater than zero will be treated as zero. This also disables Power Apps' tab index system so that it can integrate better with other components, as described above.
134
-
135
-
### Workaround for custom tab sequence
136
-
137
-
For rare scenarios where the keyboard navigation order should be different from visual order, you can position container controls carefully to have the same effect.
138
-
139
-
In the example below, button A is above button B. The natural tab navigation order is A, then B.
140
-
141
-
:::image type="content" source="media/accessible-apps-structure/simplified-tab-index-workaround-normal.png" alt-text="Two buttons with the same TabIndex, stacked vertically.":::
142
-
143
-
To reverse the tab navigation order, put B in a Container control. Set the Y value of the Container to be above A. The app structure now has the Container (and B) before A. Hence, the tab navigation order is B, then A.
144
-
145
-
:::image type="content" source="media/accessible-apps-structure/simplified-tab-index-workaround-container.png" alt-text="B is put in a container that appears before A.":::
146
-
147
-
With this technique, screen reader users will also encounter B before A when navigating without the **Tab** key.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-button.md
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -90,7 +90,7 @@ The button control now includes subset of Fluent icons. The following properties
90
90
91
91
## Additional properties
92
92
93
-
**AcceptsFocus** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
93
+
**[AcceptsFocus](../properties-accessibility.md)** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
94
94
95
95
**[OnSelect](../properties-core.md)** – Actions to perform when the user selects a control.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-info-button.md
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -70,7 +70,7 @@ Use **Info button** control to provide additional information to users.
70
70
71
71
**DisplayMode** – Whether the control allows user input (Edit), only displays data (View), or is disabled (Disabled).
72
72
73
-
**AcceptsFocus** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
73
+
**[AcceptsFocus](../properties-accessibility.md)** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
74
74
75
75
**OnSelect** - Actions to perform when the user selects a control.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-link.md
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -76,7 +76,7 @@ Use **Link** control to provide links that can be defined with accessibility com
76
76
77
77
## Additional properties
78
78
79
-
**AcceptsFocus** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
79
+
**[AcceptsFocus](../properties-accessibility.md)** - Determines whether the control can receive focus when the user navigates through the app using the keyboard.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/controls/properties-accessibility.md
+8-21Lines changed: 8 additions & 21 deletions
Original file line number
Diff line number
Diff line change
@@ -43,36 +43,23 @@ This lets screen reader users know whether a **Label** is a heading and allows t
43
43
44
44
Use **Default** for normal text.
45
45
46
-
### TabIndex
46
+
### AcceptsFocus and TabIndex
47
47
Determines if the control participates in keyboard navigation.
48
48
49
-
Keyboard navigation is an important aspect of any app. For many, the keyboard is more efficient than using touch or a mouse. The navigation order should:
50
-
- Mirror what is seen visually.
51
-
- Only have a tab stop at controls that are interactive.
52
-
- Follow either an intuitive across and then down "Z" order or a down and then across "reverse-N" order.
49
+
You can use **AcceptsFocus** to configure keyboard navigation for [modern controls](./modern-controls/overview-modern-controls.md). [Classic controls](../reference-properties.md) use **TabIndex**.
53
50
54
-
The **TabIndex** property has two recommended values:
51
+
| AcceptsFocus | TabIndex | Behavior | Default for |
| true | 0 or greater | Control participates in keyboard navigation, unless it's hidden or disabled. |[**Button**](control-button.md), [**Text input**](control-text-input.md), [**Combo box**](control-combo-box.md), and other typically interactive controls. |
54
+
| false |−1 or less than 0 | Control does not participate in keyboard navigation. |[**Label**](control-text-box.md), [**Image**](control-image.md), [**Icon**](control-shapes-icons.md), and other typically non-interactive controls. |
55
55
56
-
| TabIndex value | Behavior | Default for |
57
-
|----------------|----------|-------------|
58
-
| 0 | Control participates in keyboard navigation. |[**Button**](control-button.md), [**Text input**](control-text-input.md), [**Combo box**](control-combo-box.md), and other typically interactive controls. |
59
-
|−1 | Control does not participate in keyboard navigation. |[**Label**](control-text-box.md), [**Image**](control-image.md), [**Icon**](control-shapes-icons.md), and other typically non-interactive controls. |
60
-
61
-
Any keyboard navigation sequence can be achieved with just these values, along with the use of the [**Container**](control-container.md) control. We recommend that you do not set **TabIndex** to other values.
62
-
63
-
When **TabIndex** of all controls are set to either -1 or 0, navigation order goes from left-to-right, then top-to-bottom, in a "Z" pattern. The order is based on the **X** and **Y** property values of the controls. If controls are dynamically moved on the screen, for example, by having its **X** or **Y** value change according to a timer or other control, the navigation order will change dynamically too.
64
-
65
-
Use the [**Container**](control-container.md) control to bundle controls that should be navigated together or to create columns in a "reverse-N" pattern. Controls in **[Form Cards](control-card.md)** and [**Galleries**](control-gallery.md) are automatically grouped. Tabbing through these containers will navigate through all elements inside the container before proceeding to the next control outside of the container.
56
+
Any keyboard navigation sequence can be achieved with just these properties, along with the use of the [**Container**](control-container.md) control. For **TabIndex**, we recommend using either 0 or -1 for simplicity.
66
57
67
58
Controls that have a **Visible** property value of *false* or a **DisplayMode** property value of **Disabled** are not included in keyboard navigation.
68
59
69
60
> [!IMPORTANT]
70
-
> **TabIndex** only affects keyboard navigation. A [logical control order](../accessible-apps-structure.md) is still necessary for screen reader users to understand app structure.
61
+
> **TabIndex** only affects keyboard navigation. A [logical control order](../accessible-apps-structure.md) is still necessary for screen reader users to understand app structure. Some screen reader users don't even use keyboards.
71
62
72
-
> [!WARNING]
73
-
> -**TabIndex** values greater than zero will not be supported soon. They will be treated as if they were zero. Enable the **Simplified tab index** app setting to preview this behavior.
74
-
> - In the meantime, setting **TabIndex** to be greater than zero is one of the ways to customize keyboard navigation. This is for rare scenarios where you may not want to follow visual order or logical structure. Use caution since it can be difficult to get the order correct and accurate. It also results in a confusing screen reader experience.
75
-
> - When there are controls with **TabIndex** greater than 0, users will first navigate to controls with increasing positive **TabIndex** values (such as, 1, then 2). When users have navigated all controls with positive **TabIndex** values, they will finally navigate to controls with **TabIndex** of 0. When there are multiple controls with the same **TabIndex**, their **X** and **Y** value and the **Containers** they are in will determine their relative order. Inside a **Gallery** or **Form**, **TabIndex** is scoped so that the contained controls will be navigated first before the ones outside.
Copy file name to clipboardExpand all lines: powerapps-docs/maker/canvas-apps/create-blank-app.md
+2-1Lines changed: 2 additions & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -28,7 +28,8 @@ Watch this short video that shows you how to create a blank canvas app.
28
28
29
29
## Prerequisites
30
30
31
-
To follow this quickstart, you must be assigned to the [Environment Maker](/power-platform/admin/database-security#predefined-security-roles) security role.
31
+
In order to proceed with this quickstart, you need to be assigned the [Environment Maker](/power-platform/admin/database-security#predefined-security-roles) security role, either directly or through a Dataverse team that belongs to the **AAD Security Group** category.
0 commit comments