diff --git a/docs/API-Reference/JSUtils/Session.md b/docs/API-Reference/JSUtils/Session.md
index 82b4037c70..bc38f2b52b 100644
--- a/docs/API-Reference/JSUtils/Session.md
+++ b/docs/API-Reference/JSUtils/Session.md
@@ -243,7 +243,7 @@ the "currentIndex" property index of the hint the cursor is on, may be
### session.getJavascriptText() ⇒ String
Get the javascript text of the file open in the editor for this Session.
-For a javascript file, this is just the text of the file. For an HTML file,
+For a javascript file, this is just the text of the file. For an HTML/PHP file,
this will be only the text in the script tags. This is so that we can pass
just the javascript text to tern, and avoid confusing it with HTML tags, since it
only knows how to parse javascript.
diff --git a/docs/API-Reference/features/SelectionViewManager.md b/docs/API-Reference/features/SelectionViewManager.md
index d64b657585..43130f404f 100644
--- a/docs/API-Reference/features/SelectionViewManager.md
+++ b/docs/API-Reference/features/SelectionViewManager.md
@@ -118,9 +118,106 @@ performing any operations.
to be shown to the user. The div contents can be later updated as and when more details are available.
1. Note that the SelectionView could be hidden/removed any time by the SelectionViewManager.
1. If multiple providers returns a valid popup, all of them are displayed.
+
+* [features/SelectionViewManager](#module_features/SelectionViewManager)
+ * [.getVisibleSelectionBounds(editor, bounds)](#module_features/SelectionViewManager..getVisibleSelectionBounds) ⇒ Object \| null
+ * [.positionPreview(editor, [refreshBounds])](#module_features/SelectionViewManager..positionPreview)
+ * [.suspendPreviewLayout()](#module_features/SelectionViewManager..suspendPreviewLayout)
+ * [.restorePreviewLayout()](#module_features/SelectionViewManager..restorePreviewLayout)
+ * [.schedulePreviewLayout()](#module_features/SelectionViewManager..schedulePreviewLayout)
+ * [.onPanelResizeStart(event)](#module_features/SelectionViewManager..onPanelResizeStart)
+ * [.onPanelResizeEnd(event)](#module_features/SelectionViewManager..onPanelResizeEnd)
+ * [.showPreview(editor, selectionObj)](#module_features/SelectionViewManager..showPreview) ⇒ Promise.<void>
+ * [.onEditorScroll()](#module_features/SelectionViewManager..onEditorScroll)
+ * [.isSelectionViewShown()](#module_features/SelectionViewManager..isSelectionViewShown) ⇒ boolean
+
+
+
+### features/SelectionViewManager.getVisibleSelectionBounds(editor, bounds) ⇒ Object \| null
+Measure the visible selection highlights, including wrapped lines and partial viewport selections.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+**Returns**: Object \| null - Visible bounds and highlight rectangles, or null when none are visible.
+
+| Param | Type | Description |
+| --- | --- | --- |
+| editor | Editor | Editor containing the selection. |
+| bounds | Object | Visible editor bounds in window coordinates. |
+
+
+
+### features/SelectionViewManager.positionPreview(editor, [refreshBounds])
+Prefer below-right, then above-right, and overlap only when no outside placement fits.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| editor | Editor | Editor whose visible bounds constrain the popup. |
+| [refreshBounds] | boolean | Remeasure selection highlights after an editor layout change. |
+
+
+
+### features/SelectionViewManager.suspendPreviewLayout()
+Hide the popup without discarding its controls, and cancel any pending layout measurements.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+
+### features/SelectionViewManager.restorePreviewLayout()
+Remeasure once after resizing finishes, then reveal the existing popup at its new position.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+
+### features/SelectionViewManager.schedulePreviewLayout()
+Wait for layout events to settle when there is no explicit panel-resize lifecycle.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+
+### features/SelectionViewManager.onPanelResizeStart(event)
+Suspend positioning throughout a panel drag, including any forwarded resize events.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| event | jQuery.Event | Resize-start event whose target identifies the resizing panel. |
+
+
+
+### features/SelectionViewManager.onPanelResizeEnd(event)
+Restore the popup after all panels participating in the drag have finished resizing.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+
+| Param | Type | Description |
+| --- | --- | --- |
+| event | jQuery.Event | Resize-end event for the panel that finished resizing. |
+
+
+
+### features/SelectionViewManager.showPreview(editor, selectionObj) ⇒ Promise.<void>
+Render only the latest provider result; dismissed requests cannot reopen the popup.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
+**Returns**: Promise.<void> - Resolves after the provider results have been considered.
+
+| Param | Type | Description |
+| --- | --- | --- |
+| editor | Editor | Editor providing the selected text. |
+| selectionObj | Array.<Object> | Selected ranges supplied to providers. |
+
+
+
+### features/SelectionViewManager.onEditorScroll()
+Dismiss on editor viewport scrolling, except while workspace layout is being restored.
+
+**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
### features/SelectionViewManager.isSelectionViewShown() ⇒ boolean
-If quickview is displayed and visible on screen
+Whether the selection popup is visible, excluding temporary suspension during layout changes.
**Kind**: inner method of [features/SelectionViewManager](#module_features/SelectionViewManager)
diff --git a/docs/API-Reference/language/CodeInspection.md b/docs/API-Reference/language/CodeInspection.md
index 49c0e9d862..4927459778 100644
--- a/docs/API-Reference/language/CodeInspection.md
+++ b/docs/API-Reference/language/CodeInspection.md
@@ -111,17 +111,11 @@ Scrolls to the problem line
-## run(providerName)
-Run inspector applicable to current document. Updates status bar indicator and refreshes error list in
-bottom panel. Does not run if inspection is disabled or if a providerName is given and does not
-match the current doc's provider name.
+## run()
+Run inspectors for the current document and publish results from the latest unchanged scan.
+Does not scan while inspection is disabled. Keeps valid fixes available until a current scan replaces them.
**Kind**: global function
-
-| Param | Type | Description |
-| --- | --- | --- |
-| providerName | string | name of the provider that is requesting a run |
-
## toggleEnabled(enabled, doNotSave)
@@ -134,6 +128,23 @@ Enable or disable all inspection.
| enabled | boolean | Enabled state. If omitted, the state is toggled. |
| doNotSave | boolean | true if the preference should not be saved to user settings. This is generally for events triggered by project-level settings. |
+
+
+## \_fixProblem(fixID)
+Apply one fix if its document and text still match the displayed inspection results.
+
+**Kind**: global function
+
+| Param | Type | Description |
+| --- | --- | --- |
+| fixID | string | ID assigned to the displayed fix. |
+
+
+
+## \_fixAllProblems()
+Apply all displayed fixes only to the document version that was inspected.
+
+**Kind**: global function
## Error : Object
diff --git a/docs/API-Reference/project/ProjectManager.md b/docs/API-Reference/project/ProjectManager.md
index 7406d91fa2..3d4be8d7a9 100644
--- a/docs/API-Reference/project/ProjectManager.md
+++ b/docs/API-Reference/project/ProjectManager.md
@@ -235,6 +235,20 @@ path lies outside the project, or if it doesn't exist.
| --- | --- | --- |
| entry | File \| Directory | File or Directory to show |
+
+
+## isInFileTree(fullPath) ⇒ boolean
+Whether the file tree currently has a node for the path. A file written outside the
+FileSystem API is not in the tree until the watcher or a refresh adds it, and a file in a
+folder that was never expanded is not in it either; `showInTree` expands the folders first.
+
+**Kind**: global function
+**Returns**: boolean - true if the tree has the node
+
+| Param | Type | Description |
+| --- | --- | --- |
+| fullPath | string | Absolute path of a file or folder |
+
## openProject([path]) ⇒ $.Promise
diff --git a/docs/API-Reference/utils/Async.md b/docs/API-Reference/utils/Async.md
index 034a541db5..214a414469 100644
--- a/docs/API-Reference/utils/Async.md
+++ b/docs/API-Reference/utils/Async.md
@@ -49,6 +49,12 @@ Removes all pending promises from the queue.
Value passed to fail() handlers that have been triggered due to withTimeout()'s timeout
**Kind**: global variable
+
+
+## RETRY\_DEFAULT\_DELAYS\_MS
+The waits retry() puts between attempts when none are given: 5 s, 15 s, 30 s, 60 s.
+
+**Kind**: global constant
## doInParallel(items, beginProcessItem, failFast) ⇒ $.Promise
@@ -205,6 +211,35 @@ fail() (with Async.ERROR_TIMEOUT) is called based on value of resolveTimeout.
| timeout | number | |
| [resolveTimeout] | boolean | If true, then resolve deferred on timeout, otherwise reject. Default is false. |
+
+
+## retry(operation, [options]) ⇒ Promise
+Runs an operation again when it fails, waiting longer before each retry. Meant for calls
+that may hit a network blip or a service that is restarting: the first retry is quick and
+the later ones are spaced out, so a short outage is ridden out without hammering the other
+side. Each wait is jittered so many clients recovering at once do not retry in step.
+
+The operation is called with the attempt number, starting at 1, and returns a Promise (a
+plain value or another thenable, such as a jQuery promise, is adopted with Promise.resolve).
+A thrown error or a rejection counts as a failure. Always returns a native Promise: it
+resolves with the first successful value and rejects with the last failure once the attempts
+are used up, or as soon as `shouldRetry` says a failure is not worth retrying, or when the
+signal aborts.
+
+**Kind**: global function
+
+| Param | Type | Default | Description |
+| --- | --- | --- | --- |
+| operation | function | | called with the attempt number (1-based) |
+| [options] | Object | | |
+| [options.attempts] | number | 5 | how many times to try in all, the first included |
+| [options.delaysMs] | number \| Array.<number> | [5000, 15000, 30000, 60000] | the wait before each retry. A number is a fixed wait; an array gives the waits in order, and its last value repeats when there are more retries than entries. |
+| [options.jitter] | number | 0.25 | each wait is varied at random by up to this fraction either way; 0 disables it |
+| [options.shouldRetry] | function | | given the failure and the attempt that failed; return false to stop at once. Every failure is retried by default. |
+| [options.onRetry] | function | | told the failure, the attempt that failed and the wait in ms before each retry, for logging |
+| [options.timeoutMs] | number | | a cap on each attempt; one that runs longer fails with Async.ERROR_TIMEOUT and is retried like any other failure |
+| [options.signal] | AbortSignal | | aborting it ends the waiting and rejects with the signal's reason |
+
## waitForAll(promises, [failOnReject], [timeout]) ⇒ $.Promise
diff --git a/docs/API-Reference/widgets/NotificationUI.md b/docs/API-Reference/widgets/NotificationUI.md
index 3222a1d9bb..699038dd1a 100644
--- a/docs/API-Reference/widgets/NotificationUI.md
+++ b/docs/API-Reference/widgets/NotificationUI.md
@@ -119,7 +119,7 @@ let notification1 = NotificationUI.createFromTemplate(
| title | string | The title for the notification. |
| template | string \| Element | A string template or HTML Element to use as the dialog HTML. |
| [elementID] | String | optional id string if provided will show the notification pointing to the element. If no element is specified, it will be managed as a generic notification. |
-| [options] | Object | optional, supported * options are: * `allowedPlacements` - Optional String array with values restricting where the notification will be shown. Values can be a mix of `['top', 'bottom', 'left', 'right']` * `autoCloseTimeS` - Time in seconds after which the notification should be auto closed. Default is never. * `dismissOnClick` - when clicked, the notification is closed. Default is true(dismiss). * `toastStyle` - To style the toast notification for error, warning, info etc. Can be one of `NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.*` or your own css class name. |
+| [options] | Object | optional, supported * options are: * `allowedPlacements` - Optional String array with values restricting where the notification will be shown. Values can be a mix of `['top', 'bottom', 'left', 'right']` * `autoCloseTimeS` - Time in seconds after which the notification should be auto closed. Default is never. The countdown pauses while the mouse is over the notification. * `dismissOnClick` - when clicked, the notification is closed. Default is true(dismiss). * `toastStyle` - To style the toast notification for error, warning, info etc. Can be one of `NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.*` or your own css class name. |
@@ -146,7 +146,7 @@ let notification1 = NotificationUI.createToastFromTemplate( "Title here",
| --- | --- | --- |
| title | string | The title for the notification. |
| template | string \| Element | A string template or HTML Element to use as the dialog HTML. |
-| [options] | Object | optional, supported * options are: * `autoCloseTimeS` - Time in seconds after which the notification should be auto closed. Default is never. * `dismissOnClick` - when clicked, the notification is closed. Default is true(dismiss). * `toastStyle` - To style the toast notification for error, warning, info etc. Can be one of `NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.*` or your own css class name. * `instantOpen` - To instantly open the popup without any open animation delays |
+| [options] | Object | optional, supported * options are: * `autoCloseTimeS` - Time in seconds after which the notification should be auto closed. Default is never. The countdown pauses while the mouse is over the notification. * `dismissOnClick` - when clicked, the notification is closed. Default is true(dismiss). * `toastStyle` - To style the toast notification for error, warning, info etc. Can be one of `NotificationUI.NOTIFICATION_STYLES_CSS_CLASS.*` or your own css class name. * `instantOpen` - To instantly open the popup without any open animation delays |
@@ -168,7 +168,7 @@ NotificationUI.showToastOn(document.getElementById("my-panel"), "Hello!", {
| --- | --- | --- |
| containerOrSelector | Element \| string | A DOM element or CSS selector for the parent container. The container should have `position: relative` or `absolute` so the toast is positioned correctly. |
| template | string \| Element | HTML string or DOM Element for the toast content. |
-| [options] | Object | optional, supported options: * `autoCloseTimeS` - Time in seconds after which the toast auto-closes. Default is 5. * `dismissOnClick` - If true, clicking the toast dismisses it. Default is true. |
+| [options] | Object | optional, supported options: * `autoCloseTimeS` - Time in seconds after which the toast auto-closes. Default is 5. The countdown pauses while the mouse is over the toast. * `dismissOnClick` - If true, clicking the toast dismisses it. Default is true. |
@@ -188,7 +188,7 @@ NotificationUI.showHUD("fa-solid fa-magnifying-glass-plus", "110%");
| --- | --- | --- |
| iconClass | string | Font Awesome class string for the icon (e.g. "fa-solid fa-magnifying-glass-plus"). |
| label | string | Text to display below the icon (e.g. "110%"). |
-| [options] | Object | optional, supported options: * `autoCloseTimeS` - Time in seconds after which the HUD auto-closes. Default is 1. |
+| [options] | Object | optional, supported options: * `autoCloseTimeS` - Time in seconds after which the HUD auto-closes. Default is 1. The countdown pauses while the mouse is over the HUD. |
diff --git a/src/assets/default-project/en/Newly_added_features.md b/src/assets/default-project/en/Newly_added_features.md
index 4fca55f8b9..53d9378ad1 100644
--- a/src/assets/default-project/en/Newly_added_features.md
+++ b/src/assets/default-project/en/Newly_added_features.md
@@ -4,6 +4,60 @@ We are continuously adding features every week. [Check out our release page to s
Here's a list of top features recently added to Phoenix Code:
+## [Layers Panel: Your Page as a Tree](https://docs.phcode.dev/app-links/layers-panel)
+
+`Added in October 2026`
+
+The new **Layers** tab in the sidebar shows your page as a tree. Click a row to select the element, then edit its tag, classes, attributes, and styles right in the sidebar. Drag rows to move things around, and insert, duplicate, or delete elements without touching the code.
+
+The Styles section lists every rule that applies to the element, shows which values are overridden and by what, and lets you edit them in place.
+
+
+
+## [A New AI Panel with Built-in Claude Code](https://docs.phcode.dev/app-links/ai-chat)
+
+`Added in October 2026`
+
+Claude Code now comes built in. Sign in and start chatting, with nothing to install. The new chat shows you what the AI is doing as it works, and every change it makes can be undone with one click. You decide how much it can do on its own.
+
+New to AI? Click **Surprise Me** on the start screen to watch a demo first. Free accounts get a daily and monthly chat limit. Phoenix Pro removes the limits.
+
+> This feature is available only in desktop apps.
+
+
+
+## [Claude Code CLI and Codex CLI Inside the Editor](https://docs.phcode.dev/app-links/ai-cli)
+
+`Added in October 2026`
+
+Already use **Claude Code** or **Codex**? Run them inside the AI panel. They see the file you are editing, your unsaved changes, and the Live Preview, and they can take screenshots and open files.
+
+> Running the CLIs inside the panel is a Phoenix Pro feature, available only in desktop apps.
+
+
+
+## [Ask AI About What You See](https://docs.phcode.dev/app-links/ai-ask)
+
+`Added in October 2026`
+
+Select an element in Live Preview and click **Ask AI**. A screenshot of the element and its place in the code go with your question, so you don't have to describe where it is. The same button appears on selected code in the editor and on selected text in the Markdown preview.
+
+The AI can ask you back the same way, with a card inside the Live Preview and options you can preview on the page.
+
+> This feature is available only in desktop apps.
+
+
+
+## [Find Photos with AI](https://docs.phcode.dev/app-links/ai-images)
+
+`Added in October 2026`
+
+Ask the AI for a picture and it searches Unsplash. Pick one and it goes on your page, linked from Unsplash or downloaded into your project.
+
+> This feature is available only in desktop apps.
+
+
+
## [Style Your Page Visually with the Styles Bar](https://docs.phcode.dev/app-links/styles-bar)
`Added in August 2026`