diff --git a/.env b/.env
index 85421b83698..d248ce592e3 100644
--- a/.env
+++ b/.env
@@ -1,5 +1,5 @@
 # Production Build
-BUILD_GRID_VERSION=35.1.0-beta.20260317.135
+BUILD_GRID_VERSION=35.1.0-beta.20260318.948
 BUILD_CHARTS_VERSION=13.1.0-beta.20260317
 ENV=local
 NX_BATCH_MODE=true
diff --git a/community-modules/locale/package.json b/community-modules/locale/package.json
index 46e8b6b86a7..7c85e00e773 100644
--- a/community-modules/locale/package.json
+++ b/community-modules/locale/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@ag-grid-community/locale",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "Localisation Module for AG Grid, providing translations in 31 languages.",
   "main": "./dist/package/main.cjs.js",
   "types": "./dist/types/src/main.d.ts",
diff --git a/community-modules/styles/package.json b/community-modules/styles/package.json
index ae6060f5592..b1a3a69a4f7 100644
--- a/community-modules/styles/package.json
+++ b/community-modules/styles/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@ag-grid-community/styles",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "AG Grid Styles and Themes",
   "main": "_index.scss",
   "files": [
diff --git a/documentation/ag-grid-docs/package.json b/documentation/ag-grid-docs/package.json
index 04a2b6d8ed8..6659d6c2025 100644
--- a/documentation/ag-grid-docs/package.json
+++ b/documentation/ag-grid-docs/package.json
@@ -2,7 +2,7 @@
   "name": "ag-grid-docs",
   "description": "Documentation for AG Grid",
   "type": "module",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "repository": {
     "type": "git",
     "url": "https://github.com/ag-grid/ag-grid.git"
diff --git a/documentation/ag-grid-docs/src/content/api-documentation/grid-options/properties.json b/documentation/ag-grid-docs/src/content/api-documentation/grid-options/properties.json
index 57a60cd22d9..abb306ca0b7 100644
--- a/documentation/ag-grid-docs/src/content/api-documentation/grid-options/properties.json
+++ b/documentation/ag-grid-docs/src/content/api-documentation/grid-options/properties.json
@@ -1000,7 +1000,7 @@
         "tabToNextGridContainer": {
             "more": {
                 "name": "Custom Navigation",
-                "url": "./keyboard-navigation/#custom-navigation"
+                "url": "./keyboard-navigation/#custom-tabbing-between-grid-containers"
             }
         }
     },
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phone-editor.component_angular.ts b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phone-editor.component_angular.ts
index 948ab71b98c..70e426b393a 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phone-editor.component_angular.ts
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phone-editor.component_angular.ts
@@ -24,6 +24,7 @@ import type { ICellEditorAngularComp } from 'ag-grid-angular';
                 height: 100%;
                 box-sizing: border-box;
                 border: 1px solid transparent;
+                padding: 0.25rem 0.5rem;
             }
 
             .phone-cell-editor:focus {
@@ -54,6 +55,12 @@ export class PhoneEditor implements ICellEditorAngularComp, AfterViewInit {
         setTimeout(() => {
             this.inputRef.nativeElement.focus();
             this.inputRef.nativeElement.select();
+
+            const { cellStartedEdit, eventKey } = this.params;
+
+            if (cellStartedEdit && eventKey.length === 1) {
+                this.inputRef.nativeElement.value = eventKey;
+            }
         });
     }
 
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_typescript.ts b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_typescript.ts
index 431742668cb..a89eda77f2e 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_typescript.ts
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_typescript.ts
@@ -32,6 +32,12 @@ export class PhoneEditor implements ICellEditorComp<string> {
     public afterGuiAttached(): void {
         this.eInput.focus();
         this.eInput.select();
+
+        const { cellStartedEdit, eventKey } = this.params;
+
+        if (cellStartedEdit && eventKey.length === 1) {
+            this.eInput.value = eventKey;
+        }
     }
 
     public getValue(): string {
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_vue3.ts b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_vue3.ts
index 1a783460403..7b3d91b8f08 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_vue3.ts
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/phoneEditor_vue3.ts
@@ -31,6 +31,12 @@ export default {
             nextTick(() => {
                 this.$refs.input.focus();
                 this.$refs.input.select();
+
+                const { cellStartedEdit, eventKey } = this.params;
+
+                if (cellStartedEdit && eventKey.length === 1) {
+                    this.$refs.input.value = eventKey;
+                }
             });
         },
 
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/phoneEditor.tsx b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/phoneEditor.tsx
index 14e6bf4ccb3..5c6efcc2a03 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/phoneEditor.tsx
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/phoneEditor.tsx
@@ -3,7 +3,7 @@ import React, { memo, useCallback, useEffect, useRef, useState } from 'react';
 import { useGridCellEditor } from 'ag-grid-react';
 import type { CustomCellEditorProps } from 'ag-grid-react';
 
-export default memo(({ value, onValueChange, validate }: CustomCellEditorProps) => {
+export default memo(({ value, onValueChange, validate, cellStartedEdit, eventKey }: CustomCellEditorProps) => {
     const inputRef = useRef<HTMLInputElement>(null);
     const [internalValue, setInternalValue] = useState(value || '');
 
@@ -26,6 +26,10 @@ export default memo(({ value, onValueChange, validate }: CustomCellEditorProps)
     useEffect(() => {
         inputRef.current?.focus();
         inputRef.current?.select();
+
+        if (cellStartedEdit && eventKey.length === 1) {
+            setInternalValue(eventKey);
+        }
     }, []);
 
     const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/styles.css b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/styles.css
index 3d73f7523b8..5f76e3c98fd 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/styles.css
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/provided/reactFunctionalTs/styles.css
@@ -3,6 +3,7 @@
     height: 100%;
     box-sizing: border-box;
     border: 1px solid transparent;
+    padding: 0.25rem 0.5rem;
 }
 
 .phone-cell-editor:focus {
diff --git a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/styles.css b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/styles.css
index 3d73f7523b8..5f76e3c98fd 100644
--- a/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/styles.css
+++ b/documentation/ag-grid-docs/src/content/docs/cell-editing-validation/_examples/component-editor-validation/styles.css
@@ -3,6 +3,7 @@
     height: 100%;
     box-sizing: border-box;
     border: 1px solid transparent;
+    padding: 0.25rem 0.5rem;
 }
 
 .phone-cell-editor:focus {
diff --git a/documentation/ag-grid-docs/src/content/docs/keyboard-navigation/_examples/tab-to-next-grid-container/main.ts b/documentation/ag-grid-docs/src/content/docs/keyboard-navigation/_examples/tab-to-next-grid-container/main.ts
index d03f3cb451a..a4c98fac9a4 100644
--- a/documentation/ag-grid-docs/src/content/docs/keyboard-navigation/_examples/tab-to-next-grid-container/main.ts
+++ b/documentation/ag-grid-docs/src/content/docs/keyboard-navigation/_examples/tab-to-next-grid-container/main.ts
@@ -42,21 +42,21 @@ let lastFocusedCell: CellPosition | null = null;
 const tabToNextGridContainer: TabToNextGridContainer<IOlympicData> = (
     params: TabToNextGridContainerParams<IOlympicData>
 ) => {
-    const { backwards, fromContainer, toContainer, defaultTarget } = params;
+    const { backwards, previousContainer, nextContainer, defaultTarget } = params;
 
     // route tabbing out of the last grid cell into pagination controls first.
-    if (!backwards && fromContainer === 'gridBody' && toContainer === 'external') {
+    if (!backwards && previousContainer === 'gridBody' && nextContainer === 'external') {
         return 'pagination';
     }
 
     // restore last focused cell when shift-tabbing from pagination back into the grid.
-    if (backwards && fromContainer === 'pagination' && toContainer === 'gridBody') {
+    if (backwards && previousContainer === 'pagination' && nextContainer === 'gridBody') {
         const target = lastFocusedCell ?? defaultTarget;
         return target == null ? undefined : target;
     }
 
     // from pagination forwards, allow browser default focus flow to leave the grid.
-    if (!backwards && fromContainer === 'pagination' && toContainer === 'external') {
+    if (!backwards && previousContainer === 'pagination' && nextContainer === 'external') {
         return false;
     }
 
diff --git a/documentation/update-algolia-indices/package.json b/documentation/update-algolia-indices/package.json
index d6896934039..55600a09eb4 100644
--- a/documentation/update-algolia-indices/package.json
+++ b/documentation/update-algolia-indices/package.json
@@ -1,6 +1,6 @@
 {
   "name": "update-algolia-indices",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "Update algolia indices",
   "main": "src/index.ts",
   "type": "module",
diff --git a/external/ag-shared/scripts/setup-prompts/verify-rulesync.sh b/external/ag-shared/scripts/setup-prompts/verify-rulesync.sh
index 73ae8fefd61..53debd4bcb2 100755
--- a/external/ag-shared/scripts/setup-prompts/verify-rulesync.sh
+++ b/external/ag-shared/scripts/setup-prompts/verify-rulesync.sh
@@ -207,14 +207,15 @@ generate_to_temp() {
 
     # Resolve symlinks in the copied .rulesync to actual file content
     # This is needed because symlinks point to relative paths that won't work in temp
-    for f in "$TEMP_DIR/.rulesync/commands/"*.md "$TEMP_DIR/.rulesync/subagents/"*.md "$TEMP_DIR/.rulesync/rules/"*.md; do
+    # Handles both top-level files and files in subdirectories (e.g., rules/data-engine/)
+    while IFS= read -r -d '' f; do
         if [[ -L "$f" ]]; then
             local target
             target=$(resolve_symlink "$REPO_ROOT/.rulesync/${f#$TEMP_DIR/.rulesync/}")
             rm "$f"
             cp "$target" "$f"
         fi
-    done 2>/dev/null || true
+    done < <(find "$TEMP_DIR/.rulesync/commands" "$TEMP_DIR/.rulesync/subagents" "$TEMP_DIR/.rulesync/rules" -name "*.md" -print0 2>/dev/null) || true
 
     # Copy original AGENTS.md from repo (the expected final state)
     if [[ -f "$REPO_ROOT/AGENTS.md" ]]; then
@@ -288,6 +289,12 @@ build_expected_inventory() {
         fi
     done
 
+    # Rules in subdirectories (e.g., rules/data-engine/*.md)
+    while IFS= read -r -d '' rule_file; do
+        local rel_path="${rule_file#$REPO_ROOT/.rulesync/rules/}"
+        EXPECTED_FILES+=("$rules_dir/$rel_path")
+    done < <(find "$REPO_ROOT/.rulesync/rules" -mindepth 2 -type f -name "*.md" -print0 2>/dev/null)
+
     # Commands (claudecode only - goes to commands/)
     # Skip files with _ prefix as they are internal helper files (e.g., _review-core.md)
     if [[ "$TARGET" == "claudecode" ]] && [[ -d "$REPO_ROOT/.rulesync/commands" ]]; then
@@ -531,6 +538,31 @@ verify_content() {
         fi
     done
 
+    # Verify rules in subdirectories (e.g., rules/data-engine/*.md)
+    while IFS= read -r -d '' rule_file; do
+        local rel_path="${rule_file#$REPO_ROOT/.rulesync/rules/}"
+        local source_file
+        source_file=$(resolve_symlink "$rule_file")
+        local output_file="$temp_output/$rules_dir/$rel_path"
+
+        if [[ -f "$output_file" ]]; then
+            local source_content
+            local output_content
+            source_content=$(strip_frontmatter "$source_file" | normalise_content)
+            output_content=$(strip_frontmatter "$output_file" | normalise_content)
+
+            if [[ "$source_content" != "$output_content" ]]; then
+                log_error "Content mismatch: $rules_dir/$rel_path"
+                log_info "  Source: $source_file"
+                log_info "  Output: $output_file"
+                diff <(echo "$source_content") <(echo "$output_content") | head -20 || true
+                ((content_errors++)) || true
+            else
+                log_success "Content verified: $rel_path"
+            fi
+        fi
+    done < <(find "$REPO_ROOT/.rulesync/rules" -mindepth 2 -type f -name "*.md" -print0 2>/dev/null)
+
     # Verify commands content (claudecode only)
     # Skip files with _ prefix as they are internal helper files (e.g., _review-core.md)
     if [[ "$TARGET" == "claudecode" ]] && [[ -d "$REPO_ROOT/.rulesync/commands" ]]; then
diff --git a/package.json b/package.json
index 893196768a6..c3cfca9221f 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "license": "MIT",
   "scripts": {
     "compressVideo": "tsx external/ag-website-shared/scripts/compress-video",
diff --git a/packages/ag-grid-angular/package.json b/packages/ag-grid-angular/package.json
index 4cdf1133ee0..820ea483ac0 100644
--- a/packages/ag-grid-angular/package.json
+++ b/packages/ag-grid-angular/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-angular",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "AG Grid Angular Component",
   "scripts": {
     "clean": "rimraf dist",
@@ -15,7 +15,7 @@
   "module": "./dist/ag-grid-angular/fesm2022/ag-grid-angular.mjs",
   "typings": "./dist/ag-grid-angular/index.d.ts",
   "dependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "@angular/animations": "^18.0.7",
     "@angular/common": "^18.0.7",
     "@angular/compiler": "^18.0.7",
@@ -27,7 +27,7 @@
     "zone.js": "~0.15.1"
   },
   "devDependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "@angular-devkit/build-angular": "^18.0.7",
     "@angular/cli": "^18.0.7",
     "@angular/forms": "^18.0.7",
diff --git a/packages/ag-grid-angular/projects/ag-grid-angular/package.json b/packages/ag-grid-angular/projects/ag-grid-angular/package.json
index 17271e576c8..8d536e25407 100644
--- a/packages/ag-grid-angular/projects/ag-grid-angular/package.json
+++ b/packages/ag-grid-angular/projects/ag-grid-angular/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-angular",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "AG Grid Angular Component",
   "license": "MIT",
   "peerDependencies": {
@@ -8,7 +8,7 @@
     "@angular/core": ">= 18.0.0"
   },
   "dependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "tslib": "^2.3.0"
   },
   "repository": {
diff --git a/packages/ag-grid-community/package.json b/packages/ag-grid-community/package.json
index c6d1cf1dfae..d58ab6da89e 100644
--- a/packages/ag-grid-community/package.json
+++ b/packages/ag-grid-community/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-community",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue",
   "main": "./dist/package/main.cjs.js",
   "types": "./dist/types/src/main.d.ts",
diff --git a/packages/ag-grid-community/src/focus-overrides.test.ts b/packages/ag-grid-community/src/focus-overrides.test.ts
index 62f9e379b6d..95459f862ee 100644
--- a/packages/ag-grid-community/src/focus-overrides.test.ts
+++ b/packages/ag-grid-community/src/focus-overrides.test.ts
@@ -784,8 +784,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: false,
-                fromContainer: 'gridBody',
-                toContainer: 'pagination',
+                previousContainer: 'gridBody',
+                nextContainer: 'pagination',
                 defaultTarget: 'pagination',
             });
         });
@@ -820,8 +820,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: false,
-                fromContainer: 'pagination',
-                toContainer: 'external',
+                previousContainer: 'pagination',
+                nextContainer: 'external',
                 defaultTarget: null,
             });
         });
@@ -844,8 +844,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: false,
-                fromContainer: 'external',
-                toContainer: 'gridBody',
+                previousContainer: 'external',
+                nextContainer: 'gridBody',
                 defaultTarget: null,
             });
         });
@@ -870,8 +870,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: false,
-                fromContainer: 'gridBody',
-                toContainer: 'pagination',
+                previousContainer: 'gridBody',
+                nextContainer: 'pagination',
                 defaultTarget: 'pagination',
             });
         });
@@ -895,8 +895,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: false,
-                fromContainer: 'gridBody',
-                toContainer: 'gridBody',
+                previousContainer: 'gridBody',
+                nextContainer: 'gridBody',
                 defaultTarget: targetCell,
             });
         });
@@ -1234,8 +1234,8 @@ describe('Focus override callbacks', () => {
             expect(result).toBe(false);
             expect(tabToNextGridContainer).toHaveBeenCalledWith({
                 backwards: true,
-                fromContainer: 'external',
-                toContainer: 'pagination',
+                previousContainer: 'external',
+                nextContainer: 'pagination',
                 defaultTarget: 'pagination',
             });
         });
diff --git a/packages/ag-grid-community/src/gridComp/gridCtrl.ts b/packages/ag-grid-community/src/gridComp/gridCtrl.ts
index 8119227eea2..7acefe95482 100644
--- a/packages/ag-grid-community/src/gridComp/gridCtrl.ts
+++ b/packages/ag-grid-community/src/gridComp/gridCtrl.ts
@@ -142,15 +142,15 @@ export class GridCtrl extends BeanStub {
             });
 
             const nextContainerName = getGridContainerName(focusableContainers[resolvedNextIndex]);
-            const toContainer =
+            const nextContainer =
                 defaultTarget == null && nextContainerName === 'gridBody'
                     ? 'gridBody'
                     : getDefaultTabToNextGridContainerTargetName(defaultTarget);
 
             const userResult = userCallbackFunction({
                 backwards,
-                fromContainer: getGridContainerName(focusableContainers[indexWithFocus]),
-                toContainer,
+                previousContainer: getGridContainerName(focusableContainers[indexWithFocus]),
+                nextContainer,
                 defaultTarget,
             });
 
diff --git a/packages/ag-grid-community/src/interfaces/iCallbackParams.ts b/packages/ag-grid-community/src/interfaces/iCallbackParams.ts
index 8491b864cba..a8d9d938a60 100644
--- a/packages/ag-grid-community/src/interfaces/iCallbackParams.ts
+++ b/packages/ag-grid-community/src/interfaces/iCallbackParams.ts
@@ -151,10 +151,10 @@ export interface TabToNextGridContainerParams<TData = any, TContext = any> exten
     /** True if the Shift key is also down. */
     backwards: boolean;
     /** The container that currently has focus. */
-    fromContainer: GridContainerName;
+    previousContainer: GridContainerName;
     /** The container the grid would normally focus next. */
-    toContainer: GridContainerName;
-    /** The target the grid would normally focus when moving to `toContainer`, or `null` if it can't be represented. */
+    nextContainer: GridContainerName;
+    /** The target the grid would normally focus when moving to `nextContainer`, or `null` if it can't be represented. */
     defaultTarget: TabToNextGridContainerTarget | null;
 }
 
diff --git a/packages/ag-grid-community/src/main-internal.ts b/packages/ag-grid-community/src/main-internal.ts
index ca0fb58bb10..38342a9503f 100644
--- a/packages/ag-grid-community/src/main-internal.ts
+++ b/packages/ag-grid-community/src/main-internal.ts
@@ -504,6 +504,7 @@ export {
     _attemptToRestoreCellFocus,
     _focusGridInnerElement,
     _focusNextGridCoreContainer,
+    _skipFocusableContainerListenerForAgGrid,
 } from './utils/gridFocus';
 export { _createIcon, _createIconNoSpan } from './utils/icon';
 export { _consoleError, _warnOnce } from './utils/log';
diff --git a/packages/ag-grid-community/src/utils/gridFocus.ts b/packages/ag-grid-community/src/utils/gridFocus.ts
index 83c27a18b56..d02a3c44fa1 100644
--- a/packages/ag-grid-community/src/utils/gridFocus.ts
+++ b/packages/ag-grid-community/src/utils/gridFocus.ts
@@ -7,13 +7,14 @@ import type { TabToNextGridContainerTarget } from '../interfaces/iCallbackParams
 import type { CellPosition } from '../interfaces/iCellPosition';
 import type { FocusableContainer } from '../interfaces/iFocusableContainer';
 import type { Component } from '../widgets/component';
-import { _isStopPropagationForAgGrid } from './gridEvent';
 
 /** @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time. */
 export function _addFocusableContainerListener(beans: BeanCollection, comp: Component, eGui: HTMLElement): void {
     comp.addManagedElementListeners(eGui, {
         keydown: (e: KeyboardEvent) => {
-            if (!e.defaultPrevented && !_isStopPropagationForAgGrid(e) && e.key === KeyCode.TAB) {
+            // some managed containers handle tab themselves and only need to suppress
+            // this generic fallback for the current event.
+            if (!e.defaultPrevented && !_shouldSkipFocusableContainerListener(e) && e.key === KeyCode.TAB) {
                 const backwards = e.shiftKey;
                 if (!_findNextFocusableElement(beans, eGui, false, backwards)) {
                     if (_focusNextGridCoreContainer(beans, backwards)) {
@@ -110,3 +111,17 @@ export function _runWithContainerFocusAllowed<T>(container: FocusableContainer,
         container.setAllowFocus?.(false);
     }
 }
+
+const AG_GRID_SKIP_FOCUSABLE_CONTAINER = '__ag_Grid_Skip_Focusable_Container';
+
+/** @internal AG_GRID_INTERNAL - Not for public use. Can change / be removed at any time. */
+export function _skipFocusableContainerListenerForAgGrid(event: Event): void {
+    // this is narrower than _stopPropagationForAgGrid:
+    // it only skips _addFocusableContainerListener for this event, so other ag grid
+    // keyboard handling can continue to run normally.
+    (event as any)[AG_GRID_SKIP_FOCUSABLE_CONTAINER] = true;
+}
+
+function _shouldSkipFocusableContainerListener(event: Event): boolean {
+    return (event as any)[AG_GRID_SKIP_FOCUSABLE_CONTAINER] === true;
+}
diff --git a/packages/ag-grid-community/src/version.ts b/packages/ag-grid-community/src/version.ts
index 63095b37ec2..31c5b70fbd2 100644
--- a/packages/ag-grid-community/src/version.ts
+++ b/packages/ag-grid-community/src/version.ts
@@ -1,2 +1,2 @@
 // DO NOT UPDATE MANUALLY: Generated from script during build time
-export const VERSION = '35.1.0-beta.20260317.135';
+export const VERSION = '35.1.0-beta.20260318.948';
diff --git a/packages/ag-grid-enterprise/package.json b/packages/ag-grid-enterprise/package.json
index 3e783a5c018..547c5d6293c 100644
--- a/packages/ag-grid-enterprise/package.json
+++ b/packages/ag-grid-enterprise/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-enterprise",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "Advanced Data Grid / Data Table supporting Javascript / Typescript / React / Angular / Vue",
   "main": "./dist/package/main.cjs.js",
   "types": "./dist/types/src/main.d.ts",
@@ -113,7 +113,7 @@
   ],
   "homepage": "https://www.ag-grid.com/",
   "dependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135"
+    "ag-grid-community": "35.1.0-beta.20260318.948"
   },
   "optionalDependencies": {
     "ag-charts-community": "13.1.0-beta.20260318",
diff --git a/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts b/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
index 085a273641d..10dc4b8206c 100644
--- a/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
+++ b/packages/ag-grid-enterprise/src/sideBar/agSideBar.ts
@@ -23,7 +23,7 @@ import {
     _isVisible,
     _removeFromParent,
     _setAriaControlsAndLabel,
-    _stopPropagationForAgGrid,
+    _skipFocusableContainerListenerForAgGrid,
     _warn,
 } from 'ag-grid-community';
 
@@ -103,8 +103,9 @@ class AgSideBar extends Component implements ISideBar, FocusableContainer {
                 e.preventDefault();
                 return true;
             }
-            // avoid a second core-container evaluation from the generic focusable-container listener.
-            _stopPropagationForAgGrid(e);
+            // avoid a second core-container evaluation from the generic focusable-container listener
+            // without blocking other ag grid keyboard handling for this event.
+            _skipFocusableContainerListenerForAgGrid(e);
             return false;
         }
 
diff --git a/packages/ag-grid-enterprise/src/version.ts b/packages/ag-grid-enterprise/src/version.ts
index 63095b37ec2..31c5b70fbd2 100644
--- a/packages/ag-grid-enterprise/src/version.ts
+++ b/packages/ag-grid-enterprise/src/version.ts
@@ -1,2 +1,2 @@
 // DO NOT UPDATE MANUALLY: Generated from script during build time
-export const VERSION = '35.1.0-beta.20260317.135';
+export const VERSION = '35.1.0-beta.20260318.948';
diff --git a/packages/ag-grid-react/package.json b/packages/ag-grid-react/package.json
index 9b415d56318..e5745ec0325 100644
--- a/packages/ag-grid-react/package.json
+++ b/packages/ag-grid-react/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-react",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "AG Grid React Component",
   "main": "./dist/package/index.cjs.js",
   "types": "./dist/types/src/index.d.ts",
@@ -31,7 +31,7 @@
   "devDependencies": {
     "@babel/runtime": "^7.27.1",
     "prop-types": "^15.6.2",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "@babel/plugin-proposal-throw-expressions": "^7.27.1",
     "@babel/preset-typescript": "^7.27.1",
     "@types/react": "~18.3.26",
@@ -44,7 +44,7 @@
   },
   "dependencies": {
     "prop-types": "^15.8.1",
-    "ag-grid-community": "35.1.0-beta.20260317.135"
+    "ag-grid-community": "35.1.0-beta.20260318.948"
   },
   "peerDependencies": {
     "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
diff --git a/packages/ag-grid-vue3/package.json b/packages/ag-grid-vue3/package.json
index 7c2ea3b95a9..d5afddd7f42 100644
--- a/packages/ag-grid-vue3/package.json
+++ b/packages/ag-grid-vue3/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ag-grid-vue3",
   "description": "AG Grid Vue 3 Component",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "author": "Sean Landsman <sean@thelandsmans.com>",
   "license": "MIT",
   "files": [
@@ -44,7 +44,7 @@
     "build-only:watch": "vite build --watch"
   },
   "dependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135"
+    "ag-grid-community": "35.1.0-beta.20260318.948"
   },
   "devDependencies": {
     "vue": "^3.5.0",
diff --git a/plugins/ag-grid-generate-code-reference-files/package.json b/plugins/ag-grid-generate-code-reference-files/package.json
index c16a71faac6..1b041c143ae 100644
--- a/plugins/ag-grid-generate-code-reference-files/package.json
+++ b/plugins/ag-grid-generate-code-reference-files/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-generate-code-reference-files",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "private": true,
   "dependencies": {
     "ag-shared": "0.0.1",
diff --git a/plugins/ag-grid-generate-example-files/package.json b/plugins/ag-grid-generate-example-files/package.json
index 7f5aa6d9910..f7f452ca1da 100644
--- a/plugins/ag-grid-generate-example-files/package.json
+++ b/plugins/ag-grid-generate-example-files/package.json
@@ -1,10 +1,10 @@
 {
   "name": "ag-grid-generate-example-files",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "private": true,
   "dependencies": {
     "ag-shared": "0.0.1",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "glob": "8.0.3",
     "typescript": "~5.4.5",
     "cheerio": "^1.0.0",
diff --git a/plugins/ag-grid-task-autogen/package.json b/plugins/ag-grid-task-autogen/package.json
index eda247f9e81..a098c1bf900 100644
--- a/plugins/ag-grid-task-autogen/package.json
+++ b/plugins/ag-grid-task-autogen/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-task-autogen",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "private": true,
   "dependencies": {
     "@nx/devkit": "20.3.1",
diff --git a/testing/accessibility/package.json b/testing/accessibility/package.json
index 87f0c01b8ea..2a745f9c6f2 100644
--- a/testing/accessibility/package.json
+++ b/testing/accessibility/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-accessibility",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "scripts": {
     "download-examples": "curl --retry 5 -retry-all-errors https://grid-staging.ag-grid.com/debug/all-examples.json > ./all-examples.json",
     "download-examples-local": "curl https://localhost:4610/debug/all-examples.json > ./all-examples.json",
@@ -18,11 +18,11 @@
     "@angular/platform-browser": "^19.0.0",
     "@angular/platform-browser-dynamic": "^19.0.0",
     "@angular/router": "^19.0.0",
-    "ag-grid-angular": "35.1.0-beta.20260317.135",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
-    "ag-grid-enterprise": "35.1.0-beta.20260317.135",
-    "ag-charts-community": "13.1.0-beta.20260318",
-    "ag-charts-enterprise": "13.1.0-beta.20260318",
+    "ag-grid-angular": "35.1.0-beta.20260318.948",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
+    "ag-grid-enterprise": "35.1.0-beta.20260318.948",
+    "ag-charts-community": "13.1.0-beta.20260317",
+    "ag-charts-enterprise": "13.1.0-beta.20260317",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "zone.js": "~0.15.0"
diff --git a/testing/angular-tests/package.json b/testing/angular-tests/package.json
index c9cbaae421b..960b58effad 100644
--- a/testing/angular-tests/package.json
+++ b/testing/angular-tests/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-angular-tests",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "private": true,
   "scripts": {
     "test:e2e": "jest --no-cache"
@@ -11,8 +11,8 @@
     "@angular/core": "^21.0.0",
     "@angular/platform-browser": "^21.0.0",
     "@angular/platform-browser-dynamic": "^21.0.0",
-    "ag-grid-angular": "35.1.0-beta.20260317.135",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-angular": "35.1.0-beta.20260318.948",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "zone.js": "~0.15.0"
diff --git a/testing/behavioural/package.json b/testing/behavioural/package.json
index cd4c6009fbe..6cc68f307b6 100644
--- a/testing/behavioural/package.json
+++ b/testing/behavioural/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-behavioural-testing",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "private": true,
   "description": "Behavioural unit testing for ag-Grid",
   "dependencies": {
@@ -8,9 +8,9 @@
   },
   "type": "module",
   "devDependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135",
-    "ag-grid-enterprise": "35.1.0-beta.20260317.135",
-    "ag-grid-react": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
+    "ag-grid-enterprise": "35.1.0-beta.20260318.948",
+    "ag-grid-react": "35.1.0-beta.20260318.948",
     "@types/react": "^18.3.23",
     "@types/react-dom": "^18.3.7",
     "@testing-library/dom": "^10.4.0",
diff --git a/testing/behavioural/src/version.ts b/testing/behavioural/src/version.ts
index 63095b37ec2..31c5b70fbd2 100644
--- a/testing/behavioural/src/version.ts
+++ b/testing/behavioural/src/version.ts
@@ -1,2 +1,2 @@
 // DO NOT UPDATE MANUALLY: Generated from script during build time
-export const VERSION = '35.1.0-beta.20260317.135';
+export const VERSION = '35.1.0-beta.20260318.948';
diff --git a/testing/csp/package.json b/testing/csp/package.json
index e0e485a8a83..b605017cd6d 100644
--- a/testing/csp/package.json
+++ b/testing/csp/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-csp",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "CSP testing for AG Grid",
   "main": "index.js",
   "scripts": {},
diff --git a/testing/module-size-angular/package.json b/testing/module-size-angular/package.json
index 90358fe4efe..7427107f83f 100644
--- a/testing/module-size-angular/package.json
+++ b/testing/module-size-angular/package.json
@@ -1,6 +1,6 @@
 {
   "name": "ag-grid-module-size-angular",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "scripts": {
     "ng": "ng",
     "start": "ng serve",
@@ -20,11 +20,11 @@
     "@angular/platform-browser": "^19.0.0",
     "@angular/platform-browser-dynamic": "^19.0.0",
     "@angular/router": "^19.0.0",
-    "ag-grid-angular": "35.1.0-beta.20260317.135",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
-    "ag-grid-enterprise": "35.1.0-beta.20260317.135",
-    "ag-charts-community": "13.1.0-beta.20260318",
-    "ag-charts-enterprise": "13.1.0-beta.20260318",
+    "ag-grid-angular": "35.1.0-beta.20260318.948",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
+    "ag-grid-enterprise": "35.1.0-beta.20260318.948",
+    "ag-charts-community": "13.1.0-beta.20260317",
+    "ag-charts-enterprise": "13.1.0-beta.20260317",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "zone.js": "~0.15.0"
diff --git a/testing/module-size/package.json b/testing/module-size/package.json
index ec7d5211ed7..dc048340ce1 100644
--- a/testing/module-size/package.json
+++ b/testing/module-size/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ag-grid-module-size",
   "private": true,
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "scripts": {
     "dev": "vite",
     "cp-app": "cp ./src/App_Src.tsx ./src/App_AUTO.tsx",
@@ -14,11 +14,11 @@
     "test:e2e": "run-s \"module-combinations -- {1}\" module-validate --"
   },
   "dependencies": {
-    "ag-grid-react": "35.1.0-beta.20260317.135",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
-    "ag-grid-enterprise": "35.1.0-beta.20260317.135",
-    "ag-charts-community": "13.1.0-beta.20260318",
-    "ag-charts-enterprise": "13.1.0-beta.20260318",
+    "ag-grid-react": "35.1.0-beta.20260318.948",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
+    "ag-grid-enterprise": "35.1.0-beta.20260318.948",
+    "ag-charts-community": "13.1.0-beta.20260317",
+    "ag-charts-enterprise": "13.1.0-beta.20260317",
     "ag-shared": "0.0.1",
     "react": "^18.3.1",
     "react-dom": "^18.3.1"
diff --git a/testing/public-recipes/e2e/package.json b/testing/public-recipes/e2e/package.json
index dfbe9b74e19..f1839422524 100644
--- a/testing/public-recipes/e2e/package.json
+++ b/testing/public-recipes/e2e/package.json
@@ -1,12 +1,12 @@
 {
   "name": "ag-grid-public-e2e-testing-recipes",
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "description": "Public E2E testing recipes for AG Grid",
   "main": "index.js",
   "scripts": {},
   "license": "MIT",
   "devDependencies": {
-    "ag-grid-community": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
     "playwright": "^1.56.0",
     "@playwright/test": "^1.56.0",
     "@types/node": "^24.0.3"
diff --git a/testing/vue3-tests/package.json b/testing/vue3-tests/package.json
index 5838b27da1c..6bf9df29cf5 100644
--- a/testing/vue3-tests/package.json
+++ b/testing/vue3-tests/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ag-grid-vue3-tests",
   "private": true,
-  "version": "35.1.0-beta.20260317.135",
+  "version": "35.1.0-beta.20260318.948",
   "type": "module",
   "scripts": {
     "dev": "vite",
@@ -15,9 +15,9 @@
   "dependencies": {
     "vue": "^3.5.0",
     "vue-router": "^4.5.0",
-    "ag-grid-community": "35.1.0-beta.20260317.135",
-    "ag-grid-enterprise": "35.1.0-beta.20260317.135",
-    "ag-grid-vue3": "35.1.0-beta.20260317.135",
+    "ag-grid-community": "35.1.0-beta.20260318.948",
+    "ag-grid-enterprise": "35.1.0-beta.20260318.948",
+    "ag-grid-vue3": "35.1.0-beta.20260318.948",
     "decimal.js": "^10.4.3"
   },
   "devDependencies": {
