diff --git a/README.md b/README.md
index d90c423..9e94792 100644
--- a/README.md
+++ b/README.md
@@ -130,6 +130,7 @@ See:
| Demo name | Description and docs | Source code & Readme | Live demo page |
|---|---|---|---|
+| ARIA Actions demo | Interactive demo for the `aria-actions` ARIA attribute, which exposes a list of secondary actions on composite-widget items (tabs, options, rows) to assistive technology. | [/aria-actions/](https://github.com/MicrosoftEdge/Demos/tree/main/aria-actions) | [ARIA Actions demo](https://microsoftedge.github.io/Demos/aria-actions/) |
| Built-in AI playgrounds | Demo pages showing how to use the built-in Prompt and Writing Assistance AI APIs in Microsoft Edge. | [/built-in-ai/](https://github.com/MicrosoftEdge/Demos/tree/main/built-in-ai) | [Built-in AI playgrounds](https://microsoftedge.github.io/Demos/built-in-ai/) demo |
| CSS Gap Decorations demos | Draws line decorations within gaps in CSS Grid, Flexbox, and Multi-column layouts. | [/css-gap-decorations/](https://github.com/MicrosoftEdge/Demos/tree/main/css-gap-decorations) | [CSS Gap Decorations demos](https://microsoftedge.github.io/Demos/css-gap-decorations/) (Readme) |
| CSS Masonry demos | Showcase the implementation of CSS Masonry layout. | [/css-masonry/](https://github.com/MicrosoftEdge/Demos/tree/main/css-masonry) | [CSS Masonry demos](https://microsoftedge.github.io/Demos/css-masonry/) (Readme) |
diff --git a/aria-actions/.gitignore b/aria-actions/.gitignore
new file mode 100644
index 0000000..32bd4e6
--- /dev/null
+++ b/aria-actions/.gitignore
@@ -0,0 +1 @@
+.screenshots/
diff --git a/aria-actions/README.md b/aria-actions/README.md
new file mode 100644
index 0000000..4bd817b
--- /dev/null
+++ b/aria-actions/README.md
@@ -0,0 +1,33 @@
+# ARIA actions demo
+
+➡️ **[Open the demo](https://microsoftedge.github.io/Demos/aria-actions/)** ⬅️
+
+Interactive demo of [`aria-actions`](https://pr-preview.s3.amazonaws.com/w3c/aria/pull/1805.html), a new ARIA attribute that exposes secondary actions on an element to assistive technology. The value is an IDREFS list; each referenced element becomes an action that screen-reader users can invoke directly from the focused item.
+
+The demo covers two composite-widget patterns: tabs and a data grid. Naming and structure follow [ARIA PR 1805](https://github.com/w3c/aria/pull/1805) and the [APG Tabs with Action Buttons example](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-actions/).
+
+## What the action buttons do
+
+Clicking (or AT-invoking) an action toggles a visible state on its target item — Close strikes through the tab, Pin adds a 📌 prefix, View highlights the row, Archive dims the row and rewrites its Status cell. Clicking the same action again reverses the state. Each section has a polite live-region "Last action:" status row that announces what changed, and a **Reset section** button that restores the starting state so the demo is replayable.
+
+## Keyboard navigation
+
+The tablist and grid both use the experimental [`focusgroup`](https://open-ui.org/components/scoped-focusgroup.explainer/) attribute for declarative arrow-key navigation: `focusgroup="tablist nomemory"` on the tablist and `focusgroup="toolbar block nomemory nowrap"` on the grid's `
`. In-line action buttons (the tab Close/Pin and the in-row View/Archive) are scoped out of arrow nav with `focusgroup="none"` on their wrapper so they stay reachable by Tab. When the browser supports `focusgroup` natively, it handles arrow keys directly; otherwise the demo lazy-loads the [Microsoft focusgroup polyfill](https://github.com/microsoft/polyfills/tree/main/packages/focusgroup) from jsDelivr and lets the polyfill provide the same behaviour. If neither is available (offline, CDN blocked), the script keeps a roving-tabindex + arrow-key handler as a final fallback. A small status pill in the header reports which path is currently in use.
+
+## Learn more
+
+- [ARIA spec PR 1805 — rendered preview](https://pr-preview.s3.amazonaws.com/w3c/aria/pull/1805.html) (current normative text)
+- [Umbrella discussion: "Secondary actions on items in composite widget roles"](https://github.com/w3c/aria/issues/1440)
+- [APG: Tabs with Action Buttons example](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/examples/tabs-actions/)
+- [Proposal explainer (Sarah Higley)](https://gist.github.com/smhigley/8dbe67f834cc472e3a14bf6b289e6f0c)
+
+## Requirements
+
+The demo exercises Blink's **AriaActions** runtime feature, which is experimental and off by default in every channel. To turn it on:
+
+| Method | Instructions |
+|--------|--------------|
+| `chrome://flags` | Open `chrome://flags/#enable-experimental-web-platform-features`, set it to **Enabled**, then relaunch. |
+| Command line | Launch with `--enable-blink-features=AriaActions`. |
+
+Microsoft Edge or any Chromium-based browser will work. Firefox and Safari have not shipped support.
diff --git a/aria-actions/index.html b/aria-actions/index.html
new file mode 100644
index 0000000..6176de8
--- /dev/null
+++ b/aria-actions/index.html
@@ -0,0 +1,1053 @@
+
+
+
+
+
+
+ ARIA Actions: Interactive Demo
+
+
+
+
+
+
+
ARIA Actions Demo
+
Expose secondary actions on elements to assistive technology using the
+ aria-actions attribute.
+
+
focusgroup: loading…
+
+
+
+
+
+
+
+
+ ⚠ aria-actions is not enabled in this browser.
+ The attribute is an experimental Blink feature behind a runtime flag.
+ Enable Experimental Web Platform features at
+ about://flags/#enable-experimental-web-platform-features
+ in Microsoft Edge (or another Chromium-based browser) and relaunch.
+ If you already enabled the flag and still see this banner, the relaunch
+ is what's missing.
+
+
+
+
+
+
+
+
+
What is aria-actions?
+
+ aria-actions is a new ARIA attribute. Authors point
+ it at a list of element IDs; each referenced element becomes a
+ secondary action that screen-reader users can invoke from the focused
+ item, without first moving focus to the action button.
+
+
+ The value is an IDREFS list (space-separated IDs). Each target needs
+ an accessible name, a click handler, and a keyboard path. See the
+ explainer
+ for the full authoring requirements.
+
+ Each tab points at two action buttons. A screen reader can invoke
+ Close or Pin from the tab itself; keyboard users press
+ Delete on the focused tab as a shortcut for Close.
+
+
aria-actions="close-tab-N pin-tab-N"
+
+
+ Try it: Tab into the tablist;
+ ←/→/Home/End
+ move focus, and Delete closes the focused tab. With a
+ screen reader, Close and Pin appear as actions on whichever tab has
+ focus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Contents of index.html.
+
+
+
Contents of style.css.
+
+
+
Contents of app.js.
+
+
+
+
+
+
+ Last action:
+ (none yet)
+
+
+
+
+
+
Each tab's aria-actions lists two button IDs
+
The action buttons sit alongside the tab inside a
+ .tab-group wrapper (with role="none" so
+ the wrapper itself doesn't pollute the tablist's child roles).
+ role="tab" is Children Presentational, so the buttons
+ can't be inside the tab itself; a sibling wrapper inside the
+ tablist is fine (the APG tabs-actions example uses the
+ same pattern). axe-core flags this with
+ aria-required-children because button descendants
+ aren't a recognised tablist child role; aria-actions
+ is precisely what makes the co-location safe, so the warning
+ is a known axe-vs-spec tension rather than a real defect
+
Each button also sets aria-controls back to its tab.
+ That fits here because Close and Pin really do control the tab
+ (the grid section omits the back-reference for that
+ reason)
+
Delete on the focused tab triggers Close;
+ aria-keyshortcuts tells AT about the shortcut
+
Pin is a true toggle button: it carries
+ aria-pressed for persistent state and swaps its
+ accessible name between Pin and Unpin so the label reflects
+ the next action. The polite status line still narrates each
+ transition
+
Arrow-key navigation uses the
+ focusgroup="tablist nomemory" attribute on the
+ tablist when the browser supports it (declarative roving
+ tabindex). The script keeps an arrow-key + roving-tabindex
+ fallback for browsers without focusgroup. The action buttons
+ carry focusgroup="none" on their wrapper so they
+ stay reachable by Tab but are skipped by the
+ tablist's arrow keys
+
+
+
+
+
+
+
+
Grid with Row Actions
+
+ Each row exposes its action buttons via aria-actions set
+ on the <tr>. AT users invoke View details or
+ Archive from the row, without descending into the Actions cell.
+
+
aria-actions="view-row-N archive-row-N"
+
+
+ Try it: Tab into the grid;
+ ↑/↓/Home/End
+ move between rows. Tab from a row to reach its action buttons, and
+ Esc to return. With a screen reader, View and Archive
+ appear as actions on whichever row has focus.
+
+
+
+
+
+
+
Order
+
Customer
+
Status
+
Actions
+
+
+
+
+
+
#1024
+
Alice Johnson
+
Shipped
+
+
+
+
+
+
+
+
+
#1025
+
Bob Chen
+
Processing
+
+
+
+
+
+
+
+
+
#1026
+
Carol Davis
+
Delivered
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Last action:
+ (none yet)
+
+
+
+
+
+
aria-actions on each <tr>
+ (implicitly role="row" inside the grid) exposes
+ the row's actions
+
The buttons live in the Actions column. Only the focused row's
+ buttons are Tab stops; the JS swaps tabindex as row
+ focus moves
+
View opens a native <dialog> via
+ showModal() showing the row's details. The dialog
+ has implicit role="dialog" for a clean AT announce
+ on open. The browser handles the focus trap, Esc
+ to close, and returning focus to the View button. A small JS
+ shim adds backdrop-click-to-close so the prior
+ light-dismiss UX is preserved
+
Esc from a button returns focus to its row
+ (APG grid widget-mode)
+
The set of roles that can carry aria-actions
+ is defined by PR 1805
+ and targets child roles of composite widgets: tabs, options, rows,
+ gridcells, treeitems, and similar
+
Arrow-key navigation uses
+ focusgroup="toolbar block nomemory nowrap" on the
+ <tbody> when supported; the script keeps a
+ roving-tabindex + arrow handler as a fallback otherwise. Each
+ .row-actions span carries focusgroup="none"
+ so the in-row buttons stay reachable by Tab from the
+ focused row but are excluded from the row-level arrow nav