Skip to content

Commit bd8a8a3

Browse files
authored
Merge pull request #10298 from MicrosoftDocs/main
pushing to live
2 parents b156c27 + ba9dc50 commit bd8a8a3

11 files changed

+56
-68
lines changed

powerapps-docs/maker/canvas-apps/accessibility-keyboard-navigation.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ author: hemantgaur
55

66
ms.topic: article
77
ms.custom: canvas
8-
ms.date: 09/06/2021
8+
ms.date: 07/12/2024
99
ms.subservice: canvas-maker
1010
ms.author: hemantg
1111
search.audienceType:
@@ -24,7 +24,7 @@ contributors:
2424
> - 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.
2525
> - 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.
2626
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.
2828

2929
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.
3030

@@ -36,13 +36,13 @@ When this feature is turned on, it also enables the following boolean properties
3636
| Property Name | Description |
3737
| - | - |
3838
| **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> |
4040

4141
## Configure improved canvas keyboard navigation in your app
4242

4343
If not already enabled, follow these steps to enable this feature in your app, and set the properties mentioned earlier.
4444

45-
1. Sign in to [Power Apps](https://make.poweraps.com).
45+
1. Sign in to [Power Apps](https://make.powerapps.com).
4646

4747
1. Select **Apps** from the left-pane.
4848

@@ -66,7 +66,7 @@ Now that you understand the new feature with improved canvas keyboard navigation
6666

6767
### Default improved canvas keyboard navigation behavior
6868

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#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.
7070

7171
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.
7272

@@ -80,7 +80,7 @@ In the following example, each container and component control has the **Priorit
8080

8181
### Advanced configuration with mixed settings
8282

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.
8484

8585
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.
8686

powerapps-docs/maker/canvas-apps/accessible-apps-structure.md

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ author: tahoon-ms
55

66
ms.topic: article
77
ms.custom: canvas
8-
ms.date: 09/16/2022
8+
ms.date: 07/12/2024
99
ms.subservice: canvas-maker
1010
ms.author: tahoon
1111
ms.reviewer: mkaur
@@ -90,18 +90,42 @@ In this example, a **Gallery** row has a thumbnail and two pieces of text on the
9090

9191
## Logical keyboard navigation order
9292

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.
9497

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.
96103

97104
> [!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)
99123

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.
101125

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.
103127

104-
Avoid using custom tab indexes because of the following reasons.
128+
Some problems with custom tab indexes:
105129

106130
#### Accessibility
107131
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
120144

121145
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.
122146

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.":::
128-
129-
> [!IMPORTANT]
130-
> - This is a preview feature.
131-
> - [!INCLUDE[cc_preview_features_definition](../../includes/cc-preview-features-definition.md)]
132-
133-
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.
148147

149148
## Next steps
150149

powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-button.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ The button control now includes subset of Fluent icons. The following properties
9090

9191
## Additional properties
9292

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.
9494

9595
**[OnSelect](../properties-core.md)** – Actions to perform when the user selects a control.
9696

powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-info-button.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ Use **Info button** control to provide additional information to users.
7070

7171
**DisplayMode** – Whether the control allows user input (Edit), only displays data (View), or is disabled (Disabled).
7272

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.
7474

7575
**OnSelect** - Actions to perform when the user selects a control.
7676

powerapps-docs/maker/canvas-apps/controls/modern-controls/modern-control-link.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Use **Link** control to provide links that can be defined with accessibility com
7676

7777
## Additional properties
7878

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.
8080

8181

8282

powerapps-docs/maker/canvas-apps/controls/properties-accessibility.md

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -43,36 +43,23 @@ This lets screen reader users know whether a **Label** is a heading and allows t
4343

4444
Use **Default** for normal text.
4545

46-
### TabIndex
46+
### AcceptsFocus and TabIndex
4747
Determines if the control participates in keyboard navigation.
4848

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**.
5350

54-
The **TabIndex** property has two recommended values:
51+
| AcceptsFocus | TabIndex | Behavior | Default for |
52+
|--------------|----------|----------|-------------|
53+
| 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 | &minus;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. |
5555

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-
| &minus;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.
6657

6758
Controls that have a **Visible** property value of *false* or a **DisplayMode** property value of **Disabled** are not included in keyboard navigation.
6859

6960
> [!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.
7162
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.
7663

7764
### See also
7865

powerapps-docs/maker/canvas-apps/create-blank-app.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ Watch this short video that shows you how to create a blank canvas app.
2828
2929
## Prerequisites
3030

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.
32+
3233

3334
## Create a blank canvas app
3435

0 commit comments

Comments
 (0)