Skip to content

Connectors: Show filesystem credentials modal on plugin install - #78367

Open
westonruter wants to merge 21 commits into
trunkfrom
fix/65223-connectors-fs-credentials
Open

westonruter wants to merge 21 commits into
trunkfrom
fix/65223-connectors-fs-credentials

Conversation

@westonruter

@westonruter westonruter commented May 15, 2026 •

Copy link
Copy Markdown
Member

Important

The corresponding wordpress-develop backport PR has not been created yet. Once the approach is validated here and approved, the core PR will be created.

Edited by @t-hamano: Core backport PR: WordPress/wordpress-develop#15889

Summary

Fixes the Connectors install flow when FS_METHOD is not direct — for example, ftpext / ftpsockets. The current behavior is a generic "Failed to install plugin for X." snackbar with no path forward; Plugins > Add Plugin already handles the same case by showing the standard "Connection Information" modal.

This PR mirrors that flow on the Connectors screen:

  • lib/experimental/connectors/load.php — on the Connectors page only, enqueue wp.updates, print wp_print_request_filesystem_credentials_modal() in the footer, and expose filesystemCredentialsRequired via the script_module_data_options-connectors-wp-admin filter.
  • routes/connectors-home/use-connector-plugin.ts — when filesystemCredentialsRequired is true, route through wp.updates.installPlugin() (which knows how to surface the FTP credentials modal, collect creds, and POST them with the install). After success, activate via the existing REST flow and refresh the plugin entity. Cancelling the modal silently aborts.
  • routes/connectors-home/default-connectors.tsx — read the new flag and forward to useConnectorPlugin.

Edited by @t-hamano:

  • lib/compat/plugin/connectors.php — on the Connectors page only, enqueue wp.updates and print wp_print_request_filesystem_credentials_modal() in the footer.
  • routes/connectors-home/use-connector-plugin.ts / ai-plugin-callout.tsx — install via the REST plugin endpoint first. If it rejects with fs_unavailable, fall back to wp.updates.installPlugin(), which shows the FTP credentials modal, collects credentials, and POSTs them with the install. After success, activate via REST and refresh the plugin entity. Cancelling the modal silently aborts. Any other REST error shows the existing error notice.

Fixes Core-65223.

Screenshots

Open AI plugin is not installed yet:

Screenshot 2026-05-15 at 12 30 26

Clicking Install causes the FTP credentials modal to appear:

Screenshot 2026-05-15 at 12 26 18

Providing credentials results in the plugin being active and ready for setup:

Screenshot 2026-05-15 at 12 28 42

Test plan

Reproduces against an environment where the filesystem method requires credentials:

  • Configure environment to use an FTP filesystem. See Trac comment.
  • Ensure the AI plugin is active and at least one provider plugin (e.g. ai-provider-for-openai) is not installed.
  • Visit Settings → Connectors.
  • Click Install on the un-installed provider.
  • Confirm the standard Connection Information modal appears (matches Plugins > Add Plugin).
  • Enter valid FTP credentials and submit — the plugin installs, activates, and the API key form expands inline.
  • Re-test with invalid credentials — the modal shows the standard error and stays open.
  • Re-test with Cancel — install aborts with no error snackbar.
  • Re-test on a direct filesystem environment — the install proceeds via REST as before, no modal.

Use of AI Tools

Claude Opus 4.7 was used to create the PR and validate the fix.

Claude prompt and conversation summary

Prompt

I need to work on fixing a bug in WordPress which is seen in Trac at https://core.trac.wordpress.org/ticket/65223

The fix needs to be done in the gutenberg plugin (at src/wp-content/plugins/gutenberg).

You can reproduce the issue by going to http://localhost:8000/wp-admin/options-general.php?page=options-connectors-wp-admin in Chrome and attempting to click the Install button for OpenAI, in which case an error shows in a snackbar notification:

Failed to install plugin for OpenAI.

The fix should be added to a new branch in the gutenberg repo. Somehow the connectors screen needs to include request_filesystem_credentials() and the React components for Gutenberg need to be updated to be aware of this and to show it when needed. And then the plugin should be installed using whatever JS is involved with request_filesystem_credentials() to get a plugin installed via FTP when the user has provided the FTP credentials.

Investigation

  1. Read Trac ticket DataViews Sidebar: Display item count on DataViews sidebar #65223 — confirmed scope: install fails on Connectors page when FS_METHOD ≠ direct, while Plugins > Add Plugin handles it correctly.
  2. Traced WordPress core's existing FTP credential flow:
    • request_filesystem_credentials() + wp_print_request_filesystem_credentials_modal() in wp-admin/includes/file.php render the "Connection Information" modal.
    • wp.updates.installPlugin() (in wp-admin/js/updates.js) wraps the AJAX call, includes _fs_nonce and FTP credentials in the POST body, shows the modal when shouldRequestFilesystemCredentials is true, and fires wp-plugin-install-success/wp-plugin-install-error jQuery events.
  3. Traced the Connectors install path: the React useConnectorPlugin hook calls saveEntityRecord( 'root', 'plugin', … ), which hits WP_REST_Plugins_Controller::create_item. That controller calls is_filesystem_available(), which returns a fs_unavailable WP_Error up front whenever FS_METHOD isn't direct and no credentials are stored — so the REST endpoint can never accept FTP creds in its JSON body.
  4. Confirmed the gutenberg plugin's connectors screen is registered in lib/experimental/connectors/load.php and the per-page enqueue/render is auto-generated from packages/wp-build/templates/page-wp-admin.php.template (not safe to edit directly), so additions must hook off the connectors menu page specifically.

Implementation (commit 171d758)

Branch: fix/65223-connectors-fs-credentials in WordPress/gutenberg.

  • lib/experimental/connectors/load.php: capture the $hook_suffix from add_submenu_page() and register a load-{hook_suffix} action that

    • enqueues wp.updates, and
    • hooks admin_footer to print wp_print_request_filesystem_credentials_modal() + wp_print_admin_notice_templates().
      Also added a script_module_data_options-connectors-wp-admin filter that exposes filesystemCredentialsRequired: bool based on get_filesystem_method() and stored credentials.
  • routes/connectors-home/use-connector-plugin.ts: added a new requiresFilesystemCredentials option to the hook. When set, the install path routes through a new installPluginViaWpUpdates(slug) helper that calls wp.updates.installPlugin({ slug }) and resolves on the wp-plugin-install-success jQuery event (rejects on wp-plugin-install-error, silently aborts on credential-modal-cancel). After install succeeds, it activates via the existing REST flow and invalidates the plugin entity resolution.

  • routes/connectors-home/default-connectors.tsx: added a getRequiresFilesystemCredentials() reader on the script module data and forwarded it to useConnectorPlugin.

Verification

Tested in Chrome at http://localhost:8000/wp-admin/options-general.php?page=options-connectors-wp-admin against an environment with FS_METHOD=ftpsockets:

  1. Modal appears: clicking Install on OpenAI now opens the standard "Connection Information" dialog with Hostname / FTP Username / FTP Password / Connection Type fields — same as Plugins > Add Plugin.
  2. Full install succeeds: entered the FTP creds from the docker test env (ftp / ftpuser / ftppass), submitted, and wp plugin status ai-provider-for-openai reported Status: Active. The React UI flipped the button to Cancel and auto-expanded the API KEY entry form, matching the direct-FS path.
  3. Script module wiring: verified filesystemCredentialsRequired: true, the modal <div> present, wp.updates.installPlugin loaded, and wp.updates.shouldRequestFilesystemCredentials: true.
  4. No new lint errors on the changed files (the two pre-existing warnings are unchanged).
  5. No new console errors during the install flow (the two 404s are pre-existing — initial probes for not-yet-installed plugin entities).

After verification: deleted the installed ai-provider-for-openai plugin and the ftp_credentials option to leave the env in a re-testable state.


Generated by Claude Code

When `FS_METHOD` is not `direct` and FTP credentials have not been
stored, the REST `/wp/v2/plugins` endpoint rejects an install attempt
up front, surfacing only a generic "Failed to install plugin" snackbar
on the Connectors screen. Plugins > Add Plugin handles the same case
by displaying the standard "Connection Information" modal.

Print that modal on the Connectors screen, expose
`filesystemCredentialsRequired` via the script module data, and route
through `wp.updates.installPlugin()` when credentials are required so
the legacy AJAX install path supplies them. After the install
succeeds, activate via REST and refresh the plugin entity.
@westonruter westonruter added [Feature] Connectors screen Tracks connectors screen related tasks [Type] Bug An existing feature does not function as intended labels May 15, 2026
@github-project-automation github-project-automation Bot moved this to 🔎 Needs Review in WordPress 7.0 Editor Tasks May 15, 2026
@westonruter
westonruter marked this pull request as ready for review May 15, 2026 19:42
@westonruter
westonruter requested a review from spacedmonkey as a code owner May 15, 2026 19:42
Comment thread lib/experimental/connectors/load.php Resolved
@github-actions

github-actions Bot commented May 15, 2026 •

Copy link
Copy Markdown

Size Change: 0 B

Total Size: 8.21 MB

ℹ️ View Unchanged
Filename Size Change
build/modules/a11y/index.min.js 355 B 0 B
build/modules/abilities/index.min.js 42.3 kB 0 B
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B 0 B
build/modules/block-library/accordion/view.min.js 595 B 0 B
build/modules/block-library/file/view.min.js 346 B 0 B
build/modules/block-library/form/view.min.js 528 B 0 B
build/modules/block-library/image/view.min.js 2.64 kB 0 B
build/modules/block-library/navigation/view.min.js 1.14 kB 0 B
build/modules/block-library/playlist/view.min.js 10.9 kB 0 B
build/modules/block-library/query/view.min.js 518 B 0 B
build/modules/block-library/search/view.min.js 498 B 0 B
build/modules/block-library/tabs/view.min.js 946 B 0 B
build/modules/boot/index.min.js 51.8 kB 0 B
build/modules/connectors/index.min.js 2.05 kB 0 B
build/modules/content-types/index.min.js 157 kB 0 B
build/modules/core-abilities/index.min.js 926 B 0 B
build/modules/edit-site-init/index.min.js 1.4 kB 0 B
build/modules/interactivity-router/full-page.min.js 451 B 0 B
build/modules/interactivity-router/index.min.js 11.6 kB 0 B
build/modules/interactivity/index.min.js 15.3 kB 0 B
build/modules/latex-to-mathml/index.min.js 56.5 kB 0 B
build/modules/latex-to-mathml/loader.min.js 131 B 0 B
build/modules/lazy-editor/index.min.js 14.2 kB 0 B
build/modules/route/index.min.js 25.2 kB 0 B
build/modules/vips/loader.min.js 127 B 0 B
build/modules/vips/worker.min.js 4.56 MB 0 B
build/modules/workflow/index.min.js 19.9 kB 0 B
build/scripts/a11y/index.min.js 1.1 kB 0 B
build/scripts/annotations/index.min.js 2.53 kB 0 B
build/scripts/api-fetch/index.min.js 3.34 kB 0 B
build/scripts/autop/index.min.js 2.21 kB 0 B
build/scripts/base-styles/index.min.js 146 B 0 B
build/scripts/blob/index.min.js 665 B 0 B
build/scripts/block-directory/index.min.js 43 kB 0 B
build/scripts/block-editor/index.min.js 379 kB 0 B
build/scripts/block-library/index.min.js 324 kB 0 B
build/scripts/block-serialization-default-parser/index.min.js 1.2 kB 0 B
build/scripts/block-serialization-spec-parser/index.min.js 3.12 kB 0 B
build/scripts/blocks/index.min.js 57.1 kB 0 B
build/scripts/commands/index.min.js 21 kB 0 B
build/scripts/components/index.min.js 263 kB 0 B
build/scripts/compose/index.min.js 11.7 kB 0 B
build/scripts/core-commands/index.min.js 4.37 kB 0 B
build/scripts/core-data/index.min.js 31.4 kB 0 B
build/scripts/customize-widgets/index.min.js 14.6 kB 0 B
build/scripts/data-controls/index.min.js 832 B 0 B
build/scripts/data/index.min.js 9.74 kB 0 B
build/scripts/date/index.min.js 23.7 kB 0 B
build/scripts/deprecated/index.min.js 784 B 0 B
build/scripts/dom-ready/index.min.js 502 B 0 B
build/scripts/dom/index.min.js 5.04 kB 0 B
build/scripts/edit-post/index.min.js 52 kB 0 B
build/scripts/edit-site/index.min.js 295 kB 0 B
build/scripts/edit-widgets/index.min.js 22.2 kB 0 B
build/scripts/editor/index.min.js 462 kB 0 B
build/scripts/element/index.min.js 5.63 kB 0 B
build/scripts/escape-html/index.min.js 622 B 0 B
build/scripts/format-library/index.min.js 13.1 kB 0 B
build/scripts/hooks/index.min.js 1.86 kB 0 B
build/scripts/html-entities/index.min.js 529 B 0 B
build/scripts/i18n/index.min.js 2.5 kB 0 B
build/scripts/is-shallow-equal/index.min.js 607 B 0 B
build/scripts/keyboard-shortcuts/index.min.js 1.65 kB 0 B
build/scripts/keycodes/index.min.js 1.6 kB 0 B
build/scripts/list-reusable-blocks/index.min.js 2.53 kB 0 B
build/scripts/media-utils/index.min.js 112 kB 0 B
build/scripts/notices/index.min.js 1.72 kB 0 B
build/scripts/nux/index.min.js 909 B 0 B
build/scripts/patterns/index.min.js 8 kB 0 B
build/scripts/plugins/index.min.js 2.18 kB 0 B
build/scripts/preferences-persistence/index.min.js 2.19 kB 0 B
build/scripts/preferences/index.min.js 3.33 kB 0 B
build/scripts/primitives/index.min.js 1.05 kB 0 B
build/scripts/priority-queue/index.min.js 1.65 kB 0 B
build/scripts/private-apis/index.min.js 1.15 kB 0 B
build/scripts/react-i18n/index.min.js 868 B 0 B
build/scripts/redux-routine/index.min.js 3.4 kB 0 B
build/scripts/reusable-blocks/index.min.js 3.14 kB 0 B
build/scripts/rich-text/index.min.js 14.1 kB 0 B
build/scripts/router/index.min.js 5.99 kB 0 B
build/scripts/server-side-render/index.min.js 1.98 kB 0 B
build/scripts/shortcode/index.min.js 1.62 kB 0 B
build/scripts/style-engine/index.min.js 2.45 kB 0 B
build/scripts/sync/index.min.js 39.6 kB 0 B
build/scripts/theme/index.min.js 22 kB 0 B
build/scripts/token-list/index.min.js 767 B 0 B
build/scripts/undo-manager/index.min.js 954 B 0 B
build/scripts/upload-media/index.min.js 11.5 kB 0 B
build/scripts/url/index.min.js 4.02 kB 0 B
build/scripts/vendors/react-dom.min.js 57.7 kB 0 B
build/scripts/vendors/react-jsx-runtime.min.js 513 B 0 B
build/scripts/vendors/react.min.js 3.1 kB 0 B
build/scripts/viewport/index.min.js 1.25 kB 0 B
build/scripts/warning/index.min.js 482 B 0 B
build/scripts/widgets/index.min.js 7.84 kB 0 B
build/scripts/wordcount/index.min.js 1.07 kB 0 B
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB 0 B
build/styles/base-styles/admin-schemes-rtl.min.css 775 B 0 B
build/styles/base-styles/admin-schemes.css 1.71 kB 0 B
build/styles/base-styles/admin-schemes.min.css 775 B 0 B
build/styles/block-directory/style-rtl.css 1.97 kB 0 B
build/styles/block-directory/style-rtl.min.css 1.06 kB 0 B
build/styles/block-directory/style.css 1.98 kB 0 B
build/styles/block-directory/style.min.css 1.06 kB 0 B
build/styles/block-editor/content-rtl.css 5.51 kB 0 B
build/styles/block-editor/content-rtl.min.css 4.08 kB 0 B
build/styles/block-editor/content.css 5.52 kB 0 B
build/styles/block-editor/content.min.css 4.07 kB 0 B
build/styles/block-editor/default-editor-styles-rtl.css 697 B 0 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B 0 B
build/styles/block-editor/default-editor-styles.css 697 B 0 B
build/styles/block-editor/default-editor-styles.min.css 224 B 0 B
build/styles/block-editor/style-rtl.css 18.7 kB 0 B
build/styles/block-editor/style-rtl.min.css 15.9 kB 0 B
build/styles/block-editor/style.css 18.7 kB 0 B
build/styles/block-editor/style.min.css 15.9 kB 0 B
build/styles/block-library/accordion-heading/style-rtl.css 346 B 0 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B 0 B
build/styles/block-library/accordion-heading/style.css 346 B 0 B
build/styles/block-library/accordion-heading/style.min.css 325 B 0 B
build/styles/block-library/accordion-item/style-rtl.css 239 B 0 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B 0 B
build/styles/block-library/accordion-item/style.css 238 B 0 B
build/styles/block-library/accordion-item/style.min.css 180 B 0 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B 0 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B 0 B
build/styles/block-library/accordion-panel/style.css 110 B 0 B
build/styles/block-library/accordion-panel/style.min.css 99 B 0 B
build/styles/block-library/accordion/style-rtl.css 69 B 0 B
build/styles/block-library/accordion/style-rtl.min.css 62 B 0 B
build/styles/block-library/accordion/style.css 69 B 0 B
build/styles/block-library/accordion/style.min.css 62 B 0 B
build/styles/block-library/archives/style-rtl.css 101 B 0 B
build/styles/block-library/archives/style-rtl.min.css 90 B 0 B
build/styles/block-library/archives/style.css 101 B 0 B
build/styles/block-library/archives/style.min.css 90 B 0 B
build/styles/block-library/audio/editor-rtl.css 166 B 0 B
build/styles/block-library/audio/editor-rtl.min.css 149 B 0 B
build/styles/block-library/audio/editor.css 166 B 0 B
build/styles/block-library/audio/editor.min.css 151 B 0 B
build/styles/block-library/audio/style-rtl.css 945 B 0 B
build/styles/block-library/audio/style-rtl.min.css 132 B 0 B
build/styles/block-library/audio/style.css 945 B 0 B
build/styles/block-library/audio/style.min.css 132 B 0 B
build/styles/block-library/audio/theme-rtl.css 967 B 0 B
build/styles/block-library/audio/theme-rtl.min.css 134 B 0 B
build/styles/block-library/audio/theme.css 967 B 0 B
build/styles/block-library/audio/theme.min.css 134 B 0 B
build/styles/block-library/avatar/editor-rtl.css 127 B 0 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B 0 B
build/styles/block-library/avatar/editor.css 127 B 0 B
build/styles/block-library/avatar/editor.min.css 115 B 0 B
build/styles/block-library/avatar/style-rtl.css 117 B 0 B
build/styles/block-library/avatar/style-rtl.min.css 104 B 0 B
build/styles/block-library/avatar/style.css 117 B 0 B
build/styles/block-library/avatar/style.min.css 104 B 0 B
build/styles/block-library/breadcrumbs/style-rtl.css 236 B 0 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 206 B 0 B
build/styles/block-library/breadcrumbs/style.css 236 B 0 B
build/styles/block-library/breadcrumbs/style.min.css 206 B 0 B
build/styles/block-library/button/editor-rtl.css 306 B 0 B
build/styles/block-library/button/editor-rtl.min.css 265 B 0 B
build/styles/block-library/button/editor.css 317 B 0 B
build/styles/block-library/button/editor.min.css 265 B 0 B
build/styles/block-library/button/style-rtl.css 651 B 0 B
build/styles/block-library/button/style-rtl.min.css 596 B 0 B
build/styles/block-library/button/style.css 662 B 0 B
build/styles/block-library/button/style.min.css 596 B 0 B
build/styles/block-library/buttons/editor-rtl.css 391 B 0 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B 0 B
build/styles/block-library/buttons/editor.css 391 B 0 B
build/styles/block-library/buttons/editor.min.css 291 B 0 B
build/styles/block-library/buttons/style-rtl.css 452 B 0 B
build/styles/block-library/buttons/style-rtl.min.css 349 B 0 B
build/styles/block-library/buttons/style.css 453 B 0 B
build/styles/block-library/buttons/style.min.css 349 B 0 B
build/styles/block-library/calendar/style-rtl.css 271 B 0 B
build/styles/block-library/calendar/style-rtl.min.css 239 B 0 B
build/styles/block-library/calendar/style.css 271 B 0 B
build/styles/block-library/calendar/style.min.css 239 B 0 B
build/styles/block-library/categories/editor-rtl.css 171 B 0 B
build/styles/block-library/categories/editor-rtl.min.css 132 B 0 B
build/styles/block-library/categories/editor.css 170 B 0 B
build/styles/block-library/categories/editor.min.css 131 B 0 B
build/styles/block-library/categories/style-rtl.css 226 B 0 B
build/styles/block-library/categories/style-rtl.min.css 169 B 0 B
build/styles/block-library/categories/style.css 235 B 0 B
build/styles/block-library/categories/style.min.css 169 B 0 B
build/styles/block-library/classic-rtl.css 402 B 0 B
build/styles/block-library/classic-rtl.min.css 358 B 0 B
build/styles/block-library/classic.css 402 B 0 B
build/styles/block-library/classic.min.css 358 B 0 B
build/styles/block-library/code/editor-rtl.css 59 B 0 B
build/styles/block-library/code/editor-rtl.min.css 53 B 0 B
build/styles/block-library/code/editor.css 59 B 0 B
build/styles/block-library/code/editor.min.css 53 B 0 B
build/styles/block-library/code/style-rtl.css 158 B 0 B
build/styles/block-library/code/style-rtl.min.css 140 B 0 B
build/styles/block-library/code/style.css 178 B 0 B
build/styles/block-library/code/style.min.css 140 B 0 B
build/styles/block-library/code/theme-rtl.css 135 B 0 B
build/styles/block-library/code/theme-rtl.min.css 122 B 0 B
build/styles/block-library/code/theme.css 135 B 0 B
build/styles/block-library/code/theme.min.css 122 B 0 B
build/styles/block-library/columns/editor-rtl.css 119 B 0 B
build/styles/block-library/columns/editor-rtl.min.css 108 B 0 B
build/styles/block-library/columns/editor.css 119 B 0 B
build/styles/block-library/columns/editor.min.css 108 B 0 B
build/styles/block-library/columns/style-rtl.css 1.3 kB 0 B
build/styles/block-library/columns/style-rtl.min.css 421 B 0 B
build/styles/block-library/columns/style.css 1.3 kB 0 B
build/styles/block-library/columns/style.min.css 421 B 0 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B 0 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B 0 B
build/styles/block-library/comment-author-avatar/editor.css 136 B 0 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B 0 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B 0 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B 0 B
build/styles/block-library/comment-author-name/style.css 79 B 0 B
build/styles/block-library/comment-author-name/style.min.css 72 B 0 B
build/styles/block-library/comment-content/style-rtl.css 137 B 0 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B 0 B
build/styles/block-library/comment-content/style.css 137 B 0 B
build/styles/block-library/comment-content/style.min.css 120 B 0 B
build/styles/block-library/comment-date/style-rtl.css 72 B 0 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B 0 B
build/styles/block-library/comment-date/style.css 72 B 0 B
build/styles/block-library/comment-date/style.min.css 65 B 0 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B 0 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B 0 B
build/styles/block-library/comment-edit-link/style.css 77 B 0 B
build/styles/block-library/comment-edit-link/style.min.css 70 B 0 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B 0 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B 0 B
build/styles/block-library/comment-reply-link/style.css 78 B 0 B
build/styles/block-library/comment-reply-link/style.min.css 71 B 0 B
build/styles/block-library/comment-template/style-rtl.css 213 B 0 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B 0 B
build/styles/block-library/comment-template/style.css 213 B 0 B
build/styles/block-library/comment-template/style.min.css 191 B 0 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B 0 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B 0 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B 0 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B 0 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B 0 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B 0 B
build/styles/block-library/comments-pagination/editor.css 184 B 0 B
build/styles/block-library/comments-pagination/editor.min.css 168 B 0 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B 0 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B 0 B
build/styles/block-library/comments-pagination/style.css 236 B 0 B
build/styles/block-library/comments-pagination/style.min.css 201 B 0 B
build/styles/block-library/comments-title/editor-rtl.css 83 B 0 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B 0 B
build/styles/block-library/comments-title/editor.css 83 B 0 B
build/styles/block-library/comments-title/editor.min.css 75 B 0 B
build/styles/block-library/comments/editor-rtl.css 968 B 0 B
build/styles/block-library/comments/editor-rtl.min.css 842 B 0 B
build/styles/block-library/comments/editor.css 968 B 0 B
build/styles/block-library/comments/editor.min.css 842 B 0 B
build/styles/block-library/comments/style-rtl.css 754 B 0 B
build/styles/block-library/comments/style-rtl.min.css 637 B 0 B
build/styles/block-library/comments/style.css 752 B 0 B
build/styles/block-library/comments/style.min.css 637 B 0 B
build/styles/block-library/common-rtl.css 2.57 kB 0 B
build/styles/block-library/common-rtl.min.css 1.21 kB 0 B
build/styles/block-library/common.css 2.59 kB 0 B
build/styles/block-library/common.min.css 1.2 kB 0 B
build/styles/block-library/cover/editor-rtl.css 1.05 kB 0 B
build/styles/block-library/cover/editor-rtl.min.css 631 B 0 B
build/styles/block-library/cover/editor.css 1.05 kB 0 B
build/styles/block-library/cover/editor.min.css 631 B 0 B
build/styles/block-library/cover/style-rtl.css 2.5 kB 0 B
build/styles/block-library/cover/style-rtl.min.css 1.82 kB 0 B
build/styles/block-library/cover/style.css 2.51 kB 0 B
build/styles/block-library/cover/style.min.css 1.81 kB 0 B
build/styles/block-library/details/editor-rtl.css 72 B 0 B
build/styles/block-library/details/editor-rtl.min.css 65 B 0 B
build/styles/block-library/details/editor.css 72 B 0 B
build/styles/block-library/details/editor.min.css 65 B 0 B
build/styles/block-library/details/style-rtl.css 97 B 0 B
build/styles/block-library/details/style-rtl.min.css 86 B 0 B
build/styles/block-library/details/style.css 97 B 0 B
build/styles/block-library/details/style.min.css 86 B 0 B
build/styles/block-library/editor-elements-rtl.css 117 B 0 B
build/styles/block-library/editor-elements-rtl.min.css 75 B 0 B
build/styles/block-library/editor-elements.css 117 B 0 B
build/styles/block-library/editor-elements.min.css 75 B 0 B
build/styles/block-library/editor-rtl.css 12.5 kB 0 B
build/styles/block-library/editor-rtl.min.css 10.3 kB 0 B
build/styles/block-library/editor.css 12.5 kB 0 B
build/styles/block-library/editor.min.css 10.3 kB 0 B
build/styles/block-library/elements-rtl.css 84 B 0 B
build/styles/block-library/elements-rtl.min.css 54 B 0 B
build/styles/block-library/elements.css 84 B 0 B
build/styles/block-library/elements.min.css 54 B 0 B
build/styles/block-library/embed/editor-rtl.css 391 B 0 B
build/styles/block-library/embed/editor-rtl.min.css 331 B 0 B
build/styles/block-library/embed/editor.css 390 B 0 B
build/styles/block-library/embed/editor.min.css 331 B 0 B
build/styles/block-library/embed/style-rtl.css 1.29 kB 0 B
build/styles/block-library/embed/style-rtl.min.css 448 B 0 B
build/styles/block-library/embed/style.css 1.29 kB 0 B
build/styles/block-library/embed/style.min.css 448 B 0 B
build/styles/block-library/embed/theme-rtl.css 967 B 0 B
build/styles/block-library/embed/theme-rtl.min.css 133 B 0 B
build/styles/block-library/embed/theme.css 967 B 0 B
build/styles/block-library/embed/theme.min.css 133 B 0 B
build/styles/block-library/file/editor-rtl.css 352 B 0 B
build/styles/block-library/file/editor-rtl.min.css 324 B 0 B
build/styles/block-library/file/editor.css 353 B 0 B
build/styles/block-library/file/editor.min.css 324 B 0 B
build/styles/block-library/file/style-rtl.css 318 B 0 B
build/styles/block-library/file/style-rtl.min.css 278 B 0 B
build/styles/block-library/file/style.css 331 B 0 B
build/styles/block-library/file/style.min.css 278 B 0 B
build/styles/block-library/footnotes/style-rtl.css 220 B 0 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B 0 B
build/styles/block-library/footnotes/style.css 219 B 0 B
build/styles/block-library/footnotes/style.min.css 197 B 0 B
build/styles/block-library/form-input/editor-rtl.css 286 B 0 B
build/styles/block-library/form-input/editor-rtl.min.css 265 B 0 B
build/styles/block-library/form-input/editor.css 285 B 0 B
build/styles/block-library/form-input/editor.min.css 264 B 0 B
build/styles/block-library/form-input/style-rtl.css 467 B 0 B
build/styles/block-library/form-input/style-rtl.min.css 366 B 0 B
build/styles/block-library/form-input/style.css 467 B 0 B
build/styles/block-library/form-input/style.min.css 366 B 0 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B 0 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B 0 B
build/styles/block-library/form-submission-notification/editor.css 368 B 0 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B 0 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B 0 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B 0 B
build/styles/block-library/form-submit-button/style.css 77 B 0 B
build/styles/block-library/form-submit-button/style.min.css 69 B 0 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/freeform/editor-rtl.min.css 288 B 0 B
build/styles/block-library/freeform/editor.css 1.12 kB 0 B
build/styles/block-library/freeform/editor.min.css 288 B 0 B
build/styles/block-library/gallery/editor-rtl.css 1.46 kB 0 B
build/styles/block-library/gallery/editor-rtl.min.css 561 B 0 B
build/styles/block-library/gallery/editor.css 1.46 kB 0 B
build/styles/block-library/gallery/editor.min.css 564 B 0 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB 0 B
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB 0 B
build/styles/block-library/gallery/style.css 2.84 kB 0 B
build/styles/block-library/gallery/style.min.css 1.84 kB 0 B
build/styles/block-library/gallery/theme-rtl.css 941 B 0 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B 0 B
build/styles/block-library/gallery/theme.css 941 B 0 B
build/styles/block-library/gallery/theme.min.css 108 B 0 B
build/styles/block-library/group/editor-rtl.css 772 B 0 B
build/styles/block-library/group/editor-rtl.min.css 335 B 0 B
build/styles/block-library/group/editor.css 772 B 0 B
build/styles/block-library/group/editor.min.css 335 B 0 B
build/styles/block-library/group/style-rtl.css 120 B 0 B
build/styles/block-library/group/style-rtl.min.css 103 B 0 B
build/styles/block-library/group/style.css 120 B 0 B
build/styles/block-library/group/style.min.css 103 B 0 B
build/styles/block-library/group/theme-rtl.css 468 B 0 B
build/styles/block-library/group/theme-rtl.min.css 79 B 0 B
build/styles/block-library/group/theme.css 468 B 0 B
build/styles/block-library/group/theme.min.css 79 B 0 B
build/styles/block-library/heading/style-rtl.css 604 B 0 B
build/styles/block-library/heading/style-rtl.min.css 205 B 0 B
build/styles/block-library/heading/style.css 604 B 0 B
build/styles/block-library/heading/style.min.css 205 B 0 B
build/styles/block-library/html/editor-rtl.css 1.29 kB 0 B
build/styles/block-library/html/editor-rtl.min.css 464 B 0 B
build/styles/block-library/html/editor.css 1.3 kB 0 B
build/styles/block-library/html/editor.min.css 464 B 0 B
build/styles/block-library/icon/editor-rtl.css 776 B 0 B
build/styles/block-library/icon/editor-rtl.min.css 377 B 0 B
build/styles/block-library/icon/editor.css 776 B 0 B
build/styles/block-library/icon/editor.min.css 377 B 0 B
build/styles/block-library/icon/style-rtl.css 218 B 0 B
build/styles/block-library/icon/style-rtl.min.css 154 B 0 B
build/styles/block-library/icon/style.css 218 B 0 B
build/styles/block-library/icon/style.min.css 154 B 0 B
build/styles/block-library/image/editor-rtl.css 1.64 kB 0 B
build/styles/block-library/image/editor-rtl.min.css 782 B 0 B
build/styles/block-library/image/editor.css 1.64 kB 0 B
build/styles/block-library/image/editor.min.css 780 B 0 B
build/styles/block-library/image/style-rtl.css 2.92 kB 0 B
build/styles/block-library/image/style-rtl.min.css 1.86 kB 0 B
build/styles/block-library/image/style.css 2.92 kB 0 B
build/styles/block-library/image/style.min.css 1.85 kB 0 B
build/styles/block-library/image/theme-rtl.css 971 B 0 B
build/styles/block-library/image/theme-rtl.min.css 137 B 0 B
build/styles/block-library/image/theme.css 971 B 0 B
build/styles/block-library/image/theme.min.css 137 B 0 B
build/styles/block-library/latest-comments/style-rtl.css 392 B 0 B
build/styles/block-library/latest-comments/style-rtl.min.css 352 B 0 B
build/styles/block-library/latest-comments/style.css 390 B 0 B
build/styles/block-library/latest-comments/style.min.css 352 B 0 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B 0 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B 0 B
build/styles/block-library/latest-posts/editor.css 153 B 0 B
build/styles/block-library/latest-posts/editor.min.css 138 B 0 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB 0 B
build/styles/block-library/latest-posts/style-rtl.min.css 520 B 0 B
build/styles/block-library/latest-posts/style.css 1.37 kB 0 B
build/styles/block-library/latest-posts/style.min.css 520 B 0 B
build/styles/block-library/list/style-rtl.css 498 B 0 B
build/styles/block-library/list/style-rtl.min.css 107 B 0 B
build/styles/block-library/list/style.css 498 B 0 B
build/styles/block-library/list/style.min.css 107 B 0 B
build/styles/block-library/loginout/style-rtl.css 68 B 0 B
build/styles/block-library/loginout/style-rtl.min.css 61 B 0 B
build/styles/block-library/loginout/style.css 68 B 0 B
build/styles/block-library/loginout/style.min.css 61 B 0 B
build/styles/block-library/math/editor-rtl.css 491 B 0 B
build/styles/block-library/math/editor-rtl.min.css 105 B 0 B
build/styles/block-library/math/editor.css 502 B 0 B
build/styles/block-library/math/editor.min.css 105 B 0 B
build/styles/block-library/math/style-rtl.css 70 B 0 B
build/styles/block-library/math/style-rtl.min.css 61 B 0 B
build/styles/block-library/math/style.css 70 B 0 B
build/styles/block-library/math/style.min.css 61 B 0 B
build/styles/block-library/media-text/editor-rtl.css 389 B 0 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B 0 B
build/styles/block-library/media-text/editor.css 389 B 0 B
build/styles/block-library/media-text/editor.min.css 320 B 0 B
build/styles/block-library/media-text/style-rtl.css 873 B 0 B
build/styles/block-library/media-text/style-rtl.min.css 552 B 0 B
build/styles/block-library/media-text/style.css 901 B 0 B
build/styles/block-library/media-text/style.min.css 550 B 0 B
build/styles/block-library/more/editor-rtl.css 796 B 0 B
build/styles/block-library/more/editor-rtl.min.css 393 B 0 B
build/styles/block-library/more/editor.css 798 B 0 B
build/styles/block-library/more/editor.min.css 393 B 0 B
build/styles/block-library/navigation-link/editor-rtl.css 1.28 kB 0 B
build/styles/block-library/navigation-link/editor-rtl.min.css 710 B 0 B
build/styles/block-library/navigation-link/editor.css 1.27 kB 0 B
build/styles/block-library/navigation-link/editor.min.css 713 B 0 B
build/styles/block-library/navigation-link/style-rtl.css 579 B 0 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B 0 B
build/styles/block-library/navigation-link/style.css 579 B 0 B
build/styles/block-library/navigation-link/style.min.css 188 B 0 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 260 B 0 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 237 B 0 B
build/styles/block-library/navigation-overlay-close/style.css 260 B 0 B
build/styles/block-library/navigation-overlay-close/style.min.css 237 B 0 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B 0 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB 0 B
build/styles/block-library/navigation-submenu/editor.min.css 294 B 0 B
build/styles/block-library/navigation/editor-rtl.css 3.28 kB 0 B
build/styles/block-library/navigation/editor-rtl.min.css 2.28 kB 0 B
build/styles/block-library/navigation/editor.css 3.29 kB 0 B
build/styles/block-library/navigation/editor.min.css 2.28 kB 0 B
build/styles/block-library/navigation/style-rtl.css 3.59 kB 0 B
build/styles/block-library/navigation/style-rtl.min.css 2.52 kB 0 B
build/styles/block-library/navigation/style.css 3.59 kB 0 B
build/styles/block-library/navigation/style.min.css 2.5 kB 0 B
build/styles/block-library/nextpage/editor-rtl.css 799 B 0 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B 0 B
build/styles/block-library/nextpage/editor.css 800 B 0 B
build/styles/block-library/nextpage/editor.min.css 392 B 0 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB 0 B
build/styles/block-library/page-list/editor-rtl.min.css 356 B 0 B
build/styles/block-library/page-list/editor.css 1.18 kB 0 B
build/styles/block-library/page-list/editor.min.css 356 B 0 B
build/styles/block-library/page-list/style-rtl.css 207 B 0 B
build/styles/block-library/page-list/style-rtl.min.css 192 B 0 B
build/styles/block-library/page-list/style.css 207 B 0 B
build/styles/block-library/page-list/style.min.css 192 B 0 B
build/styles/block-library/paragraph/editor-rtl.css 315 B 0 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B 0 B
build/styles/block-library/paragraph/editor.css 314 B 0 B
build/styles/block-library/paragraph/editor.min.css 292 B 0 B
build/styles/block-library/paragraph/style-rtl.css 746 B 0 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B 0 B
build/styles/block-library/paragraph/style.css 752 B 0 B
build/styles/block-library/paragraph/style.min.css 340 B 0 B
build/styles/block-library/playlist-track/style-rtl.css 453 B 0 B
build/styles/block-library/playlist-track/style-rtl.min.css 420 B 0 B
build/styles/block-library/playlist-track/style.css 453 B 0 B
build/styles/block-library/playlist-track/style.min.css 420 B 0 B
build/styles/block-library/playlist/editor-rtl.css 120 B 0 B
build/styles/block-library/playlist/editor-rtl.min.css 112 B 0 B
build/styles/block-library/playlist/editor.css 120 B 0 B
build/styles/block-library/playlist/editor.min.css 112 B 0 B
build/styles/block-library/playlist/style-rtl.css 1.52 kB 0 B
build/styles/block-library/playlist/style-rtl.min.css 1.42 kB 0 B
build/styles/block-library/playlist/style.css 1.52 kB 0 B
build/styles/block-library/playlist/style.min.css 1.42 kB 0 B
build/styles/block-library/post-author-biography/style-rtl.css 96 B 0 B
build/styles/block-library/post-author-biography/style-rtl.min.css 86 B 0 B
build/styles/block-library/post-author-biography/style.css 96 B 0 B
build/styles/block-library/post-author-biography/style.min.css 86 B 0 B
build/styles/block-library/post-author-name/style-rtl.css 76 B 0 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B 0 B
build/styles/block-library/post-author-name/style.css 76 B 0 B
build/styles/block-library/post-author-name/style.min.css 69 B 0 B
build/styles/block-library/post-author/editor-rtl.css 490 B 0 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B 0 B
build/styles/block-library/post-author/editor.css 490 B 0 B
build/styles/block-library/post-author/editor.min.css 104 B 0 B
build/styles/block-library/post-author/style-rtl.css 213 B 0 B
build/styles/block-library/post-author/style-rtl.min.css 188 B 0 B
build/styles/block-library/post-author/style.css 214 B 0 B
build/styles/block-library/post-author/style.min.css 189 B 0 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B 0 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B 0 B
build/styles/block-library/post-comments-count/style.css 79 B 0 B
build/styles/block-library/post-comments-count/style.min.css 72 B 0 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B 0 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B 0 B
build/styles/block-library/post-comments-form/editor.css 104 B 0 B
build/styles/block-library/post-comments-form/editor.min.css 96 B 0 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B 0 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B 0 B
build/styles/block-library/post-comments-form/style.css 584 B 0 B
build/styles/block-library/post-comments-form/style.min.css 525 B 0 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B 0 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B 0 B
build/styles/block-library/post-comments-link/style.css 78 B 0 B
build/styles/block-library/post-comments-link/style.min.css 71 B 0 B
build/styles/block-library/post-content/style-rtl.css 68 B 0 B
build/styles/block-library/post-content/style-rtl.min.css 61 B 0 B
build/styles/block-library/post-content/style.css 68 B 0 B
build/styles/block-library/post-content/style.min.css 61 B 0 B
build/styles/block-library/post-date/style-rtl.css 69 B 0 B
build/styles/block-library/post-date/style-rtl.min.css 62 B 0 B
build/styles/block-library/post-date/style.css 69 B 0 B
build/styles/block-library/post-date/style.min.css 62 B 0 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B 0 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B 0 B
build/styles/block-library/post-excerpt/editor.css 78 B 0 B
build/styles/block-library/post-excerpt/editor.min.css 71 B 0 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B 0 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B 0 B
build/styles/block-library/post-excerpt/style.css 171 B 0 B
build/styles/block-library/post-excerpt/style.min.css 155 B 0 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB 0 B
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B 0 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB 0 B
build/styles/block-library/post-featured-image/editor.min.css 717 B 0 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B 0 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B 0 B
build/styles/block-library/post-featured-image/style.css 392 B 0 B
build/styles/block-library/post-featured-image/style.min.css 347 B 0 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B 0 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B 0 B
build/styles/block-library/post-navigation-link/style.css 245 B 0 B
build/styles/block-library/post-navigation-link/style.min.css 214 B 0 B
build/styles/block-library/post-template/style-rtl.css 1.27 kB 0 B
build/styles/block-library/post-template/style-rtl.min.css 441 B 0 B
build/styles/block-library/post-template/style.css 1.27 kB 0 B
build/styles/block-library/post-template/style.min.css 441 B 0 B
build/styles/block-library/post-terms/style-rtl.css 108 B 0 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B 0 B
build/styles/block-library/post-terms/style.css 108 B 0 B
build/styles/block-library/post-terms/style.min.css 96 B 0 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B 0 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B 0 B
build/styles/block-library/post-time-to-read/style.css 77 B 0 B
build/styles/block-library/post-time-to-read/style.min.css 70 B 0 B
build/styles/block-library/post-title/style-rtl.css 175 B 0 B
build/styles/block-library/post-title/style-rtl.min.css 162 B 0 B
build/styles/block-library/post-title/style.css 175 B 0 B
build/styles/block-library/post-title/style.min.css 162 B 0 B
build/styles/block-library/preformatted/style-rtl.css 511 B 0 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B 0 B
build/styles/block-library/preformatted/style.css 511 B 0 B
build/styles/block-library/preformatted/style.min.css 125 B 0 B
build/styles/block-library/pullquote/editor-rtl.css 146 B 0 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B 0 B
build/styles/block-library/pullquote/editor.css 146 B 0 B
build/styles/block-library/pullquote/editor.min.css 133 B 0 B
build/styles/block-library/pullquote/style-rtl.css 765 B 0 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B 0 B
build/styles/block-library/pullquote/style.css 764 B 0 B
build/styles/block-library/pullquote/style.min.css 365 B 0 B
build/styles/block-library/pullquote/theme-rtl.css 195 B 0 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B 0 B
build/styles/block-library/pullquote/theme.css 195 B 0 B
build/styles/block-library/pullquote/theme.min.css 176 B 0 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B 0 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B 0 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B 0 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B 0 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B 0 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B 0 B
build/styles/block-library/query-pagination/editor.css 168 B 0 B
build/styles/block-library/query-pagination/editor.min.css 154 B 0 B
build/styles/block-library/query-pagination/style-rtl.css 254 B 0 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B 0 B
build/styles/block-library/query-pagination/style.css 265 B 0 B
build/styles/block-library/query-pagination/style.min.css 237 B 0 B
build/styles/block-library/query-title/style-rtl.css 71 B 0 B
build/styles/block-library/query-title/style-rtl.min.css 64 B 0 B
build/styles/block-library/query-title/style.css 71 B 0 B
build/styles/block-library/query-title/style.min.css 64 B 0 B
build/styles/block-library/query-total/style-rtl.css 71 B 0 B
build/styles/block-library/query-total/style-rtl.min.css 64 B 0 B
build/styles/block-library/query-total/style.css 71 B 0 B
build/styles/block-library/query-total/style.min.css 64 B 0 B
build/styles/block-library/query/editor-rtl.css 1.28 kB 0 B
build/styles/block-library/query/editor-rtl.min.css 438 B 0 B
build/styles/block-library/query/editor.css 1.28 kB 0 B
build/styles/block-library/query/editor.min.css 438 B 0 B
build/styles/block-library/quote/style-rtl.css 255 B 0 B
build/styles/block-library/quote/style-rtl.min.css 238 B 0 B
build/styles/block-library/quote/style.css 256 B 0 B
build/styles/block-library/quote/style.min.css 238 B 0 B
build/styles/block-library/quote/theme-rtl.css 253 B 0 B
build/styles/block-library/quote/theme-rtl.min.css 233 B 0 B
build/styles/block-library/quote/theme.css 254 B 0 B
build/styles/block-library/quote/theme.min.css 236 B 0 B
build/styles/block-library/read-more/style-rtl.css 146 B 0 B
build/styles/block-library/read-more/style-rtl.min.css 131 B 0 B
build/styles/block-library/read-more/style.css 146 B 0 B
build/styles/block-library/read-more/style.min.css 131 B 0 B
build/styles/block-library/reset-rtl.css 936 B 0 B
build/styles/block-library/reset-rtl.min.css 467 B 0 B
build/styles/block-library/reset.css 936 B 0 B
build/styles/block-library/reset.min.css 467 B 0 B
build/styles/block-library/rss/editor-rtl.css 144 B 0 B
build/styles/block-library/rss/editor-rtl.min.css 126 B 0 B
build/styles/block-library/rss/editor.css 144 B 0 B
build/styles/block-library/rss/editor.min.css 126 B 0 B
build/styles/block-library/rss/style-rtl.css 1.11 kB 0 B
build/styles/block-library/rss/style-rtl.min.css 284 B 0 B
build/styles/block-library/rss/style.css 1.12 kB 0 B
build/styles/block-library/rss/style.min.css 283 B 0 B
build/styles/block-library/search/editor-rtl.css 217 B 0 B
build/styles/block-library/search/editor-rtl.min.css 199 B 0 B
build/styles/block-library/search/editor.css 217 B 0 B
build/styles/block-library/search/editor.min.css 199 B 0 B
build/styles/block-library/search/style-rtl.css 1.1 kB 0 B
build/styles/block-library/search/style-rtl.min.css 665 B 0 B
build/styles/block-library/search/style.css 1.1 kB 0 B
build/styles/block-library/search/style.min.css 666 B 0 B
build/styles/block-library/search/theme-rtl.css 130 B 0 B
build/styles/block-library/search/theme-rtl.min.css 113 B 0 B
build/styles/block-library/search/theme.css 130 B 0 B
build/styles/block-library/search/theme.min.css 113 B 0 B
build/styles/block-library/separator/editor-rtl.css 106 B 0 B
build/styles/block-library/separator/editor-rtl.min.css 100 B 0 B
build/styles/block-library/separator/editor.css 106 B 0 B
build/styles/block-library/separator/editor.min.css 100 B 0 B
build/styles/block-library/separator/style-rtl.css 284 B 0 B
build/styles/block-library/separator/style-rtl.min.css 248 B 0 B
build/styles/block-library/separator/style.css 297 B 0 B
build/styles/block-library/separator/style.min.css 248 B 0 B
build/styles/block-library/separator/theme-rtl.css 226 B 0 B
build/styles/block-library/separator/theme-rtl.min.css 195 B 0 B
build/styles/block-library/separator/theme.css 226 B 0 B
build/styles/block-library/separator/theme.min.css 195 B 0 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB 0 B
build/styles/block-library/shortcode/editor-rtl.min.css 286 B 0 B
build/styles/block-library/shortcode/editor.css 1.1 kB 0 B
build/styles/block-library/shortcode/editor.min.css 286 B 0 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB 0 B
build/styles/block-library/site-logo/editor-rtl.min.css 696 B 0 B
build/styles/block-library/site-logo/editor.css 1.12 kB 0 B
build/styles/block-library/site-logo/editor.min.css 692 B 0 B
build/styles/block-library/site-logo/style-rtl.css 239 B 0 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B 0 B
build/styles/block-library/site-logo/style.css 238 B 0 B
build/styles/block-library/site-logo/style.min.css 218 B 0 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B 0 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B 0 B
build/styles/block-library/site-tagline/editor.css 94 B 0 B
build/styles/block-library/site-tagline/editor.min.css 87 B 0 B
build/styles/block-library/site-tagline/style-rtl.css 72 B 0 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B 0 B
build/styles/block-library/site-tagline/style.css 72 B 0 B
build/styles/block-library/site-tagline/style.min.css 65 B 0 B
build/styles/block-library/site-title/editor-rtl.css 93 B 0 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B 0 B
build/styles/block-library/site-title/editor.css 93 B 0 B
build/styles/block-library/site-title/editor.min.css 85 B 0 B
build/styles/block-library/site-title/style-rtl.css 153 B 0 B
build/styles/block-library/site-title/style-rtl.min.css 143 B 0 B
build/styles/block-library/site-title/style.css 153 B 0 B
build/styles/block-library/site-title/style.min.css 143 B 0 B
build/styles/block-library/social-link/editor-rtl.css 346 B 0 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B 0 B
build/styles/block-library/social-link/editor.css 348 B 0 B
build/styles/block-library/social-link/editor.min.css 314 B 0 B
build/styles/block-library/social-links/editor-rtl.css 737 B 0 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B 0 B
build/styles/block-library/social-links/editor.css 738 B 0 B
build/styles/block-library/social-links/editor.min.css 338 B 0 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB 0 B
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB 0 B
build/styles/block-library/social-links/style.css 1.57 kB 0 B
build/styles/block-library/social-links/style.min.css 1.51 kB 0 B
build/styles/block-library/spacer/editor-rtl.css 774 B 0 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B 0 B
build/styles/block-library/spacer/editor.css 774 B 0 B
build/styles/block-library/spacer/editor.min.css 346 B 0 B
build/styles/block-library/spacer/style-rtl.css 55 B 0 B
build/styles/block-library/spacer/style-rtl.min.css 48 B 0 B
build/styles/block-library/spacer/style.css 55 B 0 B
build/styles/block-library/spacer/style.min.css 48 B 0 B
build/styles/block-library/style-rtl.css 21.6 kB 0 B
build/styles/block-library/style-rtl.min.css 18.1 kB 0 B
build/styles/block-library/style.css 21.7 kB 0 B
build/styles/block-library/style.min.css 18 kB 0 B
build/styles/block-library/tab-list/editor-rtl.css 107 B 0 B
build/styles/block-library/tab-list/editor-rtl.min.css 97 B 0 B
build/styles/block-library/tab-list/editor.css 107 B 0 B
build/styles/block-library/tab-list/editor.min.css 97 B 0 B
build/styles/block-library/tab-panel/style-rtl.css 238 B 0 B
build/styles/block-library/tab-panel/style-rtl.min.css 215 B 0 B
build/styles/block-library/tab-panel/style.css 238 B 0 B
build/styles/block-library/tab-panel/style.min.css 215 B 0 B
build/styles/block-library/tab-panels/style-rtl.css 76 B 0 B
build/styles/block-library/tab-panels/style-rtl.min.css 65 B 0 B
build/styles/block-library/tab-panels/style.css 76 B 0 B
build/styles/block-library/tab-panels/style.min.css 65 B 0 B
build/styles/block-library/tab/editor-rtl.css 160 B 0 B
build/styles/block-library/tab/editor-rtl.min.css 148 B 0 B
build/styles/block-library/tab/editor.css 160 B 0 B
build/styles/block-library/tab/editor.min.css 148 B 0 B
build/styles/block-library/tab/style-rtl.css 397 B 0 B
build/styles/block-library/tab/style-rtl.min.css 352 B 0 B
build/styles/block-library/tab/style.css 398 B 0 B
build/styles/block-library/tab/style.min.css 356 B 0 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B 0 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B 0 B
build/styles/block-library/table-of-contents/style.css 89 B 0 B
build/styles/block-library/table-of-contents/style.min.css 83 B 0 B
build/styles/block-library/table/editor-rtl.css 1.25 kB 0 B
build/styles/block-library/table/editor-rtl.min.css 394 B 0 B
build/styles/block-library/table/editor.css 1.25 kB 0 B
build/styles/block-library/table/editor.min.css 394 B 0 B
build/styles/block-library/table/style-rtl.css 1.06 kB 0 B
build/styles/block-library/table/style-rtl.min.css 641 B 0 B
build/styles/block-library/table/style.css 1.06 kB 0 B
build/styles/block-library/table/style.min.css 640 B 0 B
build/styles/block-library/table/theme-rtl.css 985 B 0 B
build/styles/block-library/table/theme-rtl.min.css 152 B 0 B
build/styles/block-library/table/theme.css 985 B 0 B
build/styles/block-library/table/theme.min.css 152 B 0 B
build/styles/block-library/tabs/style-rtl.css 64 B 0 B
build/styles/block-library/tabs/style-rtl.min.css 57 B 0 B
build/styles/block-library/tabs/style.css 64 B 0 B
build/styles/block-library/tabs/style.min.css 57 B 0 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B 0 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B 0 B
build/styles/block-library/tag-cloud/style.css 283 B 0 B
build/styles/block-library/tag-cloud/style.min.css 248 B 0 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB 0 B
build/styles/block-library/template-part/editor-rtl.min.css 368 B 0 B
build/styles/block-library/template-part/editor.css 1.2 kB 0 B
build/styles/block-library/template-part/editor.min.css 368 B 0 B
build/styles/block-library/template-part/theme-rtl.css 492 B 0 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B 0 B
build/styles/block-library/template-part/theme.css 492 B 0 B
build/styles/block-library/template-part/theme.min.css 113 B 0 B
build/styles/block-library/term-count/style-rtl.css 70 B 0 B
build/styles/block-library/term-count/style-rtl.min.css 63 B 0 B
build/styles/block-library/term-count/style.css 70 B 0 B
build/styles/block-library/term-count/style.min.css 63 B 0 B
build/styles/block-library/term-description/style-rtl.css 138 B 0 B
build/styles/block-library/term-description/style-rtl.min.css 126 B 0 B
build/styles/block-library/term-description/style.css 138 B 0 B
build/styles/block-library/term-description/style.min.css 126 B 0 B
build/styles/block-library/term-name/style-rtl.css 69 B 0 B
build/styles/block-library/term-name/style-rtl.min.css 62 B 0 B
build/styles/block-library/term-name/style.css 69 B 0 B
build/styles/block-library/term-name/style.min.css 62 B 0 B
build/styles/block-library/term-template/editor-rtl.css 267 B 0 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B 0 B
build/styles/block-library/term-template/editor.css 267 B 0 B
build/styles/block-library/term-template/editor.min.css 225 B 0 B
build/styles/block-library/term-template/style-rtl.css 124 B 0 B
build/styles/block-library/term-template/style-rtl.min.css 114 B 0 B
build/styles/block-library/term-template/style.css 124 B 0 B
build/styles/block-library/term-template/style.min.css 114 B 0 B
build/styles/block-library/text-columns/editor-rtl.css 481 B 0 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B 0 B
build/styles/block-library/text-columns/editor.css 481 B 0 B
build/styles/block-library/text-columns/editor.min.css 95 B 0 B
build/styles/block-library/text-columns/style-rtl.css 177 B 0 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B 0 B
build/styles/block-library/text-columns/style.css 177 B 0 B
build/styles/block-library/text-columns/style.min.css 165 B 0 B
build/styles/block-library/theme-rtl.css 1.59 kB 0 B
build/styles/block-library/theme-rtl.min.css 715 B 0 B
build/styles/block-library/theme.css 1.6 kB 0 B
build/styles/block-library/theme.min.css 719 B 0 B
build/styles/block-library/verse/style-rtl.css 155 B 0 B
build/styles/block-library/verse/style-rtl.min.css 137 B 0 B
build/styles/block-library/verse/style.css 155 B 0 B
build/styles/block-library/verse/style.min.css 137 B 0 B
build/styles/block-library/video/editor-rtl.css 839 B 0 B
build/styles/block-library/video/editor-rtl.min.css 428 B 0 B
build/styles/block-library/video/editor.css 840 B 0 B
build/styles/block-library/video/editor.min.css 428 B 0 B
build/styles/block-library/video/style-rtl.css 1.02 kB 0 B
build/styles/block-library/video/style-rtl.min.css 202 B 0 B
build/styles/block-library/video/style.css 1.02 kB 0 B
build/styles/block-library/video/style.min.css 202 B 0 B
build/styles/block-library/video/theme-rtl.css 967 B 0 B
build/styles/block-library/video/theme-rtl.min.css 134 B 0 B
build/styles/block-library/video/theme.css 967 B 0 B
build/styles/block-library/video/theme.min.css 134 B 0 B
build/styles/commands/style-rtl.css 2.07 kB 0 B
build/styles/commands/style-rtl.min.css 1.17 kB 0 B
build/styles/commands/style.css 2.06 kB 0 B
build/styles/commands/style.min.css 1.17 kB 0 B
build/styles/components/style-rtl.css 17.8 kB 0 B
build/styles/components/style-rtl.min.css 14.7 kB 0 B
build/styles/components/style.css 17.9 kB 0 B
build/styles/components/style.min.css 14.8 kB 0 B
build/styles/customize-widgets/style-rtl.css 2.35 kB 0 B
build/styles/customize-widgets/style-rtl.min.css 1.44 kB 0 B
build/styles/customize-widgets/style.css 2.35 kB 0 B
build/styles/customize-widgets/style.min.css 1.44 kB 0 B
build/styles/edit-post/classic-rtl.css 1.29 kB 0 B
build/styles/edit-post/classic-rtl.min.css 425 B 0 B
build/styles/edit-post/classic.css 1.31 kB 0 B
build/styles/edit-post/classic.min.css 428 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor-rtl.css 550 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor-rtl.min.css 513 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor.css 551 B 0 B
build/styles/edit-post/experimental-admin-bar-in-editor.min.css 514 B 0 B
build/styles/edit-post/style-rtl.css 3.8 kB 0 B
build/styles/edit-post/style-rtl.min.css 2.48 kB 0 B
build/styles/edit-post/style.css 3.81 kB 0 B
build/styles/edit-post/style.min.css 2.49 kB 0 B
build/styles/edit-site/experimental-admin-bar-in-editor-rtl.css 502 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor-rtl.min.css 474 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor.css 502 B 0 B
build/styles/edit-site/experimental-admin-bar-in-editor.min.css 474 B 0 B
build/styles/edit-site/style-rtl.css 21.3 kB 0 B
build/styles/edit-site/style-rtl.min.css 17.4 kB 0 B
build/styles/edit-site/style.css 21.3 kB 0 B
build/styles/edit-site/style.min.css 17.4 kB 0 B
build/styles/edit-widgets/style-rtl.css 4.85 kB 0 B
build/styles/edit-widgets/style-rtl.min.css 3.52 kB 0 B
build/styles/edit-widgets/style.css 4.85 kB 0 B
build/styles/edit-widgets/style.min.css 3.52 kB 0 B
build/styles/editor/style-rtl.css 29.4 kB 0 B
build/styles/editor/style-rtl.min.css 24.9 kB 0 B
build/styles/editor/style.css 29.5 kB 0 B
build/styles/editor/style.min.css 24.9 kB 0 B
build/styles/format-library/style-rtl.css 735 B 0 B
build/styles/format-library/style-rtl.min.css 326 B 0 B
build/styles/format-library/style.css 746 B 0 B
build/styles/format-library/style.min.css 326 B 0 B
build/styles/list-reusable-blocks/style-rtl.css 1.03 kB 0 B
build/styles/list-reusable-blocks/style-rtl.min.css 210 B 0 B
build/styles/list-reusable-blocks/style.css 1.03 kB 0 B
build/styles/list-reusable-blocks/style.min.css 211 B 0 B
build/styles/media-utils/style-rtl.css 2.12 kB 0 B
build/styles/media-utils/style-rtl.min.css 1.2 kB 0 B
build/styles/media-utils/style.css 2.11 kB 0 B
build/styles/media-utils/style.min.css 1.2 kB 0 B
build/styles/notices/style-rtl.css 121 B 0 B
build/styles/notices/style-rtl.min.css 106 B 0 B
build/styles/notices/style.css 121 B 0 B
build/styles/notices/style.min.css 106 B 0 B
build/styles/nux/style-rtl.css 118 B 0 B
build/styles/nux/style-rtl.min.css 0 B 0 B 🆕
build/styles/nux/style.css 118 B 0 B
build/styles/nux/style.min.css 0 B 0 B 🆕
build/styles/patterns/style-rtl.css 1.46 kB 0 B
build/styles/patterns/style-rtl.min.css 611 B 0 B
build/styles/patterns/style.css 1.46 kB 0 B
build/styles/patterns/style.min.css 611 B 0 B
build/styles/preferences/style-rtl.css 1.26 kB 0 B
build/styles/preferences/style-rtl.min.css 415 B 0 B
build/styles/preferences/style.css 1.26 kB 0 B
build/styles/preferences/style.min.css 415 B 0 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB 0 B
build/styles/reusable-blocks/style-rtl.min.css 275 B 0 B
build/styles/reusable-blocks/style.css 1.11 kB 0 B
build/styles/reusable-blocks/style.min.css 275 B 0 B
build/styles/widgets/style-rtl.css 2.05 kB 0 B
build/styles/widgets/style-rtl.min.css 1.16 kB 0 B
build/styles/widgets/style.css 2.06 kB 0 B
build/styles/widgets/style.min.css 1.16 kB 0 B

compressed-size-action

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes the Connectors plugin-install flow when the WordPress filesystem method is not direct (e.g. FTP), by mirroring Core’s standard “Connection Information” modal behavior so users have a clear path to provide credentials and complete installation.

Changes:

  • Enqueues Core’s updates installer script and prints the filesystem credentials modal footer markup on the Connectors admin screen.
  • Exposes a filesystemCredentialsRequired flag to the Connectors script module so the client can choose the correct install mechanism.
  • Updates the Connectors install hook to route through wp.updates.installPlugin() when credentials are required, then activates via REST.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 3 comments.

File Description
lib/experimental/connectors/load.php Adds Connectors-screen setup for updates script + filesystem credentials modal, and exposes a “credentials required” flag to script module data.
routes/connectors-home/use-connector-plugin.ts Adds a wp.updates-based install path when filesystem credentials are needed, and suppresses snackbar on user-cancel.
routes/connectors-home/default-connectors.tsx Reads the new script module flag and passes it into the connector install hook.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/experimental/connectors/load.php Resolved
@github-actions

github-actions Bot commented May 15, 2026 •

Copy link
Copy Markdown

Flaky tests detected in 530755e.
Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

🔍 Workflow run URL: https://github.com/WordPress/gutenberg/actions/runs/26016663464
📝 Reported issues:

westonruter and others added 3 commits May 15, 2026 13:31
- Register the install event handlers with on()/off() instead of one()
  and filter by slug. With one(), a concurrent install of a different
  plugin firing first would consume the one-shot handler and leave the
  promise pending. on() + explicit cleanup() only tears down once the
  matching slug's event arrives.
- Replace the brittle "cancel via hard-coded error message string"
  detection. installPluginViaWpUpdates() now resolves with
  'installed' | 'canceled' so cancel is a normal control-flow outcome
  the caller branches on, while genuine install failures still reject.

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

Copilot AI commented May 15, 2026

Copy link
Copy Markdown
Contributor

Just as a heads up, I was blocked by some firewall rules while working on your feedback. Expand below for details.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • translate.wordpress.org
    • Triggering command: /usr/local/bin/node node i18n-cache/index.js (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

@ekamran

ekamran commented May 16, 2026

Copy link
Copy Markdown
Contributor

I tested this PR locally with FS_METHOD set to ftpext.

The provider connector cards now open the standard “Connection Information” filesystem credentials modal as expected. I tested this with the OpenAI connector, and canceling the modal returned the button back to Install without the previous generic install failure.

I noticed one related case that still seems to use the old REST install path: the top “Install the AI plugin” callout. When clicking that button on the same Connectors screen, it shows “Failed to install the AI plugin.” instead of opening the filesystem credentials modal.

Steps:

  1. Use an environment with FS_METHOD=ftpext.
  2. Visit Settings > Connectors.
  3. Click “Install the AI plugin”.

Expected: the standard filesystem credentials modal opens, matching the provider connector install flow.

Actual: the install fails with the generic AI plugin install error.

westonruter and others added 2 commits May 15, 2026 20:44
The "Install the AI plugin" button in AiPluginCallout had the same
silent-failure bug as the connector install: it POSTed directly to the
REST plugin endpoint, which rejects the install up front when
FS_METHOD is not 'direct' and credentials have not been stored.

Reuse the now-exported installPluginViaWpUpdates() helper so the AI
plugin install routes through wp.updates.installPlugin() (surfacing the
standard "Connection Information" modal) when credentials are required,
then activates via REST. The non-FS path is unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…-fs-credentials

Resolved a modify/delete conflict from trunk #78228, which relocated the
Connectors loader out of lib/experimental/connectors/load.php and
consolidated it into lib/compat/wordpress-7.0/connectors.php. The
filesystem-credentials additions (the load-{hook} screen setup, the
credentials-modal printer, and the script-module-data filter) were
ported into the new connectors.php location; the obsolete
experimental/connectors/load.php was removed (its default-connectors.php
require is now handled directly by lib/load.php).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@westonruter

westonruter commented May 16, 2026 •

Copy link
Copy Markdown
Member Author

I noticed one related case that still seems to use the old REST install path: the top “Install the AI plugin” callout. When clicking that button on the same Connectors screen, it shows “Failed to install the AI plugin.” instead of opening the filesystem credentials modal.

@ekamran Great catch! This is fixed now in 8d3b1c2.

The merge conflicts are also fixed in 9ae49aa after #78228, although this may cause problems if this is cherry-picked to wp/7.0? /cc @t-hamano

@westonruter

Copy link
Copy Markdown
Member Author

Here's a screen recording showing the installation of the AI plugin via FTP:

AI.plugin.install.via.FTP.mov

(Ignore Chrome's warning about an insecure FTP password! ☺️)

@t-hamano

Copy link
Copy Markdown
Contributor

The merge conflicts are also fixed in 9ae49aa after #78228, although this may cause problems if this is cherry-picked to wp/7.0? /cc @t-hamano

If we intend to backport this PR to WP 7.0, we can backport #78228 to the wp/7.0 branch to resolve conflicts beforehand. #78228 will not have any impact on WordPress core releases.

request_filesystem_credentials() returns true (no credentials needed),
false (needed but not provided), or an array (needed and provided).
Only the explicit false sentinel should set filesystemCredentialsRequired,
so compare with `false === $stored` instead of `! $stored`. This avoids
coercing a (theoretical) empty-array return to "required" and matches
the strict-boolean expectation of PHPStan, mirroring the Performance Lab
counterpart which already uses the strict comparison.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@ekamran

ekamran commented May 17, 2026

Copy link
Copy Markdown
Contributor

Thanks for the follow-up fix here.

I pulled the latest PR head (675d2eb1e824a7d462172ed541133aa84d8c12a4) and re-tested locally with FS_METHOD set to ftpext.

After rebuilding the Gutenberg assets, I can confirm the UI behavior looks fixed for both paths I checked:

  • Provider connector cards open the standard “Connection Information” modal.
  • The top “Install the AI plugin” callout also opens the same filesystem credentials modal now.

One thing I noticed while checking the latest branch: the targeted unit test for the AI plugin callout is still failing locally:

npm run test:unit -- routes/connectors-home/test/ai-plugin-callout.tsx --runInBand

Failure:

AiPluginCallout › installs the AI plugin using the plugin slug

Expected mockSaveEntityRecord to be called with:
"root", "plugin", { "slug": "ai", "status": "active" }, { "throwOnError": true }

Number of calls: 0

From a quick look, AiPluginCallout now imports getRequiresFilesystemCredentials() from ../default-connectors, but the test mock for ../default-connectors only provides getConnectorData(). The existing non-filesystem test may just need the mock to return false for getRequiresFilesystemCredentials(), and it may be worth adding a companion test for the filesystem-credentials path.

@ekamran

ekamran commented May 17, 2026

Copy link
Copy Markdown
Contributor

I was also able to get the failing AiPluginCallout unit test passing locally with a small test-only change.

The patch updates the ../default-connectors mock to include getRequiresFilesystemCredentials() with a default false return value, and adds a focused test for the filesystem-credentials path where the AI plugin install is routed through installPluginViaWpUpdates() before activating ai/ai.

After that change, the focused test passes locally:

npm run test:unit -- routes/connectors-home/test/ai-plugin-callout.tsx --runInBand
PASS routes/connectors-home/test/ai-plugin-callout.tsx
Tests: 3 passed

Happy to share the patch or open a small follow-up PR if that would be helpful.

@cbravobernal cbravobernal moved this from 🔎 Needs Review to 🦵 Punted to 7.1 in WordPress 7.0 Editor Tasks Jul 7, 2026
@github-project-automation github-project-automation Bot moved this to 🔎 Needs Review in WordPress 7.2 Editor Tasks Aug 13, 2026
@t-hamano t-hamano removed the Backport to WP Minor Release Pull request that needs to be backported to a WordPress minor release label Aug 26, 2026
@ekamran

ekamran commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

@westonruter would it help if I build t-hamano's fs_unavailable approach on current trunk, with the conflicts fixed and the tests updated, so you can pull it into this PR or review it separately? I tested both approaches in May and both worked. cc @t-hamano

@github-actions

github-actions Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

🤖 PR meta 🤖

🎉 Props

If you're merging code through a pull request on GitHub, copy and paste the following into the bottom of the merge commit message.

Co-authored-by: westonruter <westonruter@git.wordpress.org>
Co-authored-by: ekamran <ekamran@git.wordpress.org>
Co-authored-by: t-hamano <wildworks@git.wordpress.org>
Co-authored-by: jeffpaul <jeffpaul@git.wordpress.org>

To understand the WordPress project's expectations around crediting contributors, please review the Contributor Attribution page in the Core Handbook.


Props Bot commands

You can trigger Props Bot actions by commenting on this PR:

  • @propsbot add <username> to give props to a GitHub user. Requires write access.
  • @propsbot remove <username> to leave a user out of the props. Requires write access.
  • @propsbot refresh to refresh this list. Adding the props-bot label works too.

Updated as activity occurs, without notifying anyone named here. Add the props-bot label to refresh.

📦 Bundle size

Size Change: 0 B

Total Size: 8.63 MB

987e3ef Run

⚡ Performance

Show the results

Client side metrics exclude the server response time.

front-end-block-theme

Metric 8d5cc85 trunk % Change
timeToFirstByte 43.35 ms +12.23% -5.19% 51.55 ms +9.99% -8.05% -15.91%
largestContentfulPaint 68 ms +11.76% -2.94% 82 ms +7.32% -4.88% -17.07%
lcpMinusTtfb 25 ms +14.8% -6.6% 29.7 ms +21.04% -17.17% -15.82%
wpBeforeTemplate 22.58 ms +11.25% -4.87% 25.86 ms +13.57% -6.34% -12.68%
wpTemplate 16.92 ms +6.97% -2.84% 20.33 ms +9.3% -2.8% -16.77%
wpTotal 40.08 ms +11.1% -5.41% 47.45 ms +10.87% -7.38% -15.53%
wpMemoryUsage 7.72 MB +0% -0% 7.68 MB +0% -0% 0.43%
wpDbQueries 16 +0% -0% 16 +0% -0% 0%

front-end-classic-theme

Metric 8d5cc85 trunk % Change
timeToFirstByte 35.35 ms +7.78% -0.71% 41.7 ms +8.27% -3.6% -15.23%
largestContentfulPaint 64 ms +6.25% -0% 76 ms +5.26% -5.26% -15.79%
lcpMinusTtfb 28.95 ms +3.63% -1.04% 31.35 ms +12.6% -3.19% -7.66%
wpBeforeTemplate 19.22 ms +12.07% -1.04% 23.1 ms +2.38% -6.8% -16.8%
wpTemplate 13.47 ms +2.75% -3.79% 16.4 ms +2.62% -7.68% -17.87%
wpTotal 32.64 ms +8.24% -1.19% 38.57 ms +7.21% -3.27% -15.37%
wpMemoryUsage 6.41 MB +0% -0% 6.37 MB +0% -0% 0.53%
wpDbQueries 13 +0% -0% 13 +0% -0% 0%

media-processing

Metric 8d5cc85 trunk % Change
mediaProcessingJpeg 324.09 ms +1.71% -0.23% 334.96 ms +0.33% -1.27% -3.25%
mediaProcessingAvif 4846.4 ms +0.29% -0.15% 4913.03 ms +0.26% -0.25% -1.36%
mediaProcessingJpegToAvif 3397.54 ms +0.18% -0.17% 3403.45 ms +0.34% -0.13% -0.17%

media-upload

Metric 8d5cc85 trunk % Change
jpegUploadProcessing 1480.63 ms +0.6% -2.36% 1480.1 ms +0.79% -0.5% 0.04%
pngUploadProcessing 248.09 ms +6.53% -1.48% 251.01 ms +6.58% -7.05% -1.16%
largeJpegUploadProcessing 1448.41 ms +1.1% -0.41% 1458.45 ms +0.87% -0.69% -0.69%
multipleImageUploadProcessing 1519.88 ms +0.22% -1.44% 1554.15 ms +1.72% -1.61% -2.21%

post-editor

Metric 8d5cc85 trunk % Change
serverResponse 412.02 ms +1.45% -8.03% 417.04 ms +2.82% -6.64% -1.2%
firstPaint 432.38 ms +13.11% -9.26% 415.77 ms +6.68% -6.55% 3.99%
domContentLoaded 811.29 ms +3.13% -2.18% 820.27 ms +0.7% -0.72% -1.09%
loaded 812.39 ms +3.14% -2.18% 821.33 ms +0.71% -0.72% -1.09%
firstContentfulPaint 458.43 ms +6.68% -1.46% 464.57 ms +1.31% -1.76% -1.32%
firstBlock 2125.33 ms +3.87% -2.46% 2117.37 ms +1.5% -0.55% 0.38%
type 17.34 ms +6.81% -8.3% 18.27 ms +3.07% -10.84% -5.09%
typeWithoutInspector 17.35 ms +2.25% -12.16% 17.78 ms +3.77% -13.84% -2.42%
typeWithTopToolbar 22.26 ms +17.12% -5.71% 22.92 ms +4.41% -4.23% -2.88%
typeContainer 8.58 ms +3.03% -7.23% 8.1 ms +5.68% -19.26% 5.93%
focus 121.54 ms +10.84% -6.15% 122 ms +5.07% -12.53% -0.38%
firstFocus 254.98 ms +0% -0% 249.19 ms +0% -0% 2.32%
selectAll 360.54 ms +1.3% -0.35% 337.27 ms +5.24% -0.01% 6.9%
undo 29.52 ms +8.1% -4.37% 31.8 ms +3.3% -9.34% -7.17%
listViewOpen 77.23 ms +8.17% -5.53% 74.13 ms +10.41% -4.4% 4.18%
inserterOpen 42.88 ms +5.32% -2.99% 43.94 ms +6.4% -1.52% -2.41%
inserterHover 13.18 ms +4.02% -9.26% 12.4 ms +14.27% -8.95% 6.29%
inserterSearch 8.66 ms +9.58% -11.78% 8.79 ms +7.39% -9.33% -1.48%
loadPatterns 700 ms +1.31% -2.97% 733.49 ms +3.17% -4.26% -4.57%
wpTotal 402.42 ms +1.48% -8.22% 407.33 ms +2.65% -6.79% -1.21%
wpMemoryUsage 14.77 MB +0% -0% 14.74 MB +0% -0% 0.25%
wpDbQueries 55 +0% -0% 55 +0% -0% 0%

site-editor

Metric 8d5cc85 trunk % Change
serverResponse 321.8 ms +0.74% -8.32% 316.41 ms +1.51% -9.47% 1.7%
firstPaint 360.65 ms +9.59% -10.07% 333.87 ms +12.18% -5.61% 8.02%
domContentLoaded 665.65 ms +1.79% -1.26% 651.29 ms +0.91% -0.95% 2.2%
loaded 666.5 ms +1.78% -1.26% 652.02 ms +0.94% -0.95% 2.22%
firstContentfulPaint 376.56 ms +5.02% -0.87% 372.97 ms +1.14% -2.25% 0.96%
firstBlock 2020.14 ms +8.18% -0.63% 1963.23 ms +1.74% -0.23% 2.9%
type 13.92 ms +6.03% -6.9% 14.88 ms +4.84% -3.83% -6.45%
navigate 95.89 ms +4.76% -8.16% 107.72 ms +0.97% -10.17% -10.98%
loadPatterns 1138.14 ms +12.55% -7.56% 1054.12 ms +4.72% -2.03% 7.97%
loadPages 998.7 ms +1.84% -2.23% 989.34 ms +2.28% -0.31% 0.95%
wpTotal 313.43 ms +0.73% -8.55% 308.07 ms +1.5% -9.72% 1.74%
wpMemoryUsage 12.79 MB +0% -0% 12.75 MB +0% -0% 0.29%
wpDbQueries 45 +0% -0% 45 +0% -0% 0%

987e3ef Run

🏁 Flaky tests

Some tests passed with failed attempts. The failures may not be related to this commit but are still reported for visibility. See the documentation for more information.

Navigates the items list via UP/DOWN arrow keys in /test/e2e/specs/site-editor/dataviews-list-layout-keyboard.spec.js, passed after 1 failed attempt.
Error: expect(locator).toBeFocused() failed

Locator:  getByLabel('Page Two')
Expected: focused
Received: inactive
Timeout:  5000ms

Call log:
  - Expect "toBeFocused" getByLabel('Page Two') with timeout 5000ms
  - waiting for getByLabel('Page Two')
    14 × locator resolved to <button type="button" tabindex="-1" aria-pressed="false" id="view-list-0-175-item-wrapper" class="dataviews-view-list__item" aria-labelledby="view-list-0-175-label" aria-describedby="view-list-0-175-description"></button>
       - unexpected value "inactive"

    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/site-editor/dataviews-list-layout-keyboard.spec.js:146:49
Page List converts to Navigation Links with entity bindings in /test/e2e/specs/editor/blocks/navigation.spec.js, passed after 1 failed attempt.
Error: expect(locator).toContainText(expected) failed

Locator: getByRole('region', { name: 'Editor settings' }).getByRole('tabpanel', { name: 'Content' }).getByRole('button', { name: /Link to:/ })
Expected substring: "test-page-1"
Received string:    "Link to:Cat/catPagePublished"
Timeout: 5000ms

Call log:
  - Expect "toContainText" getByRole('region', { name: 'Editor settings' }).getByRole('tabpanel', { name: 'Content' }).getByRole('button', { name: /Link to:/ }) with timeout 5000ms
  - waiting for getByRole('region', { name: 'Editor settings' }).getByRole('tabpanel', { name: 'Content' }).getByRole('button', { name: /Link to:/ })
    14 × locator resolved to <button type="button" aria-expanded="false" aria-haspopup="dialog" class="components-button link-preview-button is-next-40px-default-size is-secondary">…</button>
       - unexpected value "Link to:Cat/catPagePublished"

    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/blocks/navigation.spec.js:1949:31
Undo restores the post selection when another synced entity is loaded in /test/e2e/specs/editor/collaboration/collaboration-undo-redo.spec.ts, passed after 1 failed attempt.
Error: expect(received).toMatchObject(expected)

- Expected  - 2
+ Received  + 2

  Object {
    "attributeKey": "content",
    "blockIndex": 0,
    "content": "abcdef",
-   "endOffset": 3,
-   "offset": 3,
+   "endOffset": 2,
+   "offset": 2,
  }

Call Log:
- Timeout 5000ms exceeded while waiting on the predicate
    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/collaboration/collaboration-undo-redo.spec.ts:363:5
inserts patterns by dragging and dropping from the global inserter in /test/e2e/specs/editor/various/inserting-blocks.spec.js, passed after 1 failed attempt.
Error: expect(string).toMatchSnapshot(expected) failed

  @@ -1,10 +1,7 @@
  -<!-- wp:paragraph -->
  -<p>Dummy text</p>
  -<!-- /wp:paragraph -->
  -
  -<!-- wp:query {"queryId":1,"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false},"metadata":{"categories":["posts"],"patternName":"core/query-standard-posts","name":"Standard"}} -->
  +<!-- wp:group {"layout":{"type":"flex","flexWrap":"nowrap"}} -->
  +<div class="wp-block-group"><!-- wp:query {"queryId":1,"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false},"metadata":{"categories":["posts"],"patternName":"core/query-standard-posts","name":"Standard"}} -->
   <div class="wp-block-query"><!-- wp:post-template -->
   <!-- wp:post-title {"isLink":true} /-->
   
   <!-- wp:post-featured-image {"isLink":true,"align":"wide"} /-->
   
  @@ -15,5 +12,10 @@
   <!-- /wp:separator -->
   
   <!-- wp:post-date {"metadata":{"bindings":{"datetime":{"source":"core/post-data","args":{"field":"date"}}}}} /-->
   <!-- /wp:post-template --></div>
   <!-- /wp:query -->
  +
  +<!-- wp:paragraph -->
  +<p>Dummy text</p>
  +<!-- /wp:paragraph --></div>
  +<!-- /wp:group -->


    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/various/inserting-blocks.spec.js:267:49
should select with shift + click in /test/e2e/specs/editor/various/multi-block-selection.spec.js, passed after 1 failed attempt.
Error: expect(received).toEqual(expected) // deep equality

- Expected  - 1
+ Received  + 0

  Array [
-   1,
    2,
  ]

Call Log:
- Timeout 5000ms exceeded while waiting on the predicate
    at /home/runner/work/gutenberg/gutenberg/test/e2e/specs/editor/various/multi-block-selection.spec.js:380:5

987e3ef Run

claude and others added 3 commits October 14, 2026 09:48
Resolve conflicts after trunk bumped the minimum WordPress version to 7.0
and moved to Vitest:

- Move the Connectors filesystem credentials setup from the removed
  lib/compat/wordpress-7.0/connectors.php into lib/compat/plugin/connectors.php.
- Drop the root @types/jquery devDependency, since root devDependencies were
  moved into workspaces, and use minimal local jQuery types instead.
- Port the AiPluginCallout filesystem credentials tests to Vitest.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVht4racQmKuYmELHoLXdx
…le error

Instead of computing `filesystemCredentialsRequired` on the server and
exposing it through script module data, attempt the standard REST plugin
install first and fall back to `wp.updates.installPlugin()` only when the
endpoint rejects with the `fs_unavailable` error code. The REST response
becomes the single source of truth, and the PHP flag is removed.

The Connectors screen still enqueues the `updates` script and prints the
filesystem credentials modal so the fallback can show it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FVht4racQmKuYmELHoLXdx
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: t-hamano <54422211+t-hamano@users.noreply.github.com>
Claude-Session: https://claude.ai/code/session_01FVht4racQmKuYmELHoLXdx
@t-hamano

Copy link
Copy Markdown
Contributor

@ekamran Thanks for the offer! I've resolved the conflicts with trunk and pushed the fs_unavailable approach directly to this PR. The install now tries the REST endpoint first and falls back to wp.updates.installPlugin() only when it rejects with fs_unavailable, so the filesystemCredentialsRequired flag is no longer needed. I've also linked the core backport PR WordPress/wordpress-develop#13953 and updated the PR description.

@westonruter, could you take a look when you have a chance?

@ekamran

ekamran commented Oct 14, 2026

Copy link
Copy Markdown
Contributor

Thanks for picking this up. I tested the latest head (cc37947) on wordpress-develop trunk with Weston's FTP setup (FS_METHOD set to ftpsockets). I also tested the core side with WordPress/wordpress-develop#13953, and that report goes on the Trac ticket.

The main flows work:

  • The AI plugin callout and the connector cards open the Connection Information modal. Correct credentials install and activate the plugin, and for a connector the API key form opens.
  • On the callout, Cancel aborts with no error snackbar, and a wrong password shows the FTP error and keeps the modal open.
  • A second install on the same page load reuses the entered credentials without a modal.
  • With FTP_HOST, FTP_USER and FTP_PASS defined, and on direct, the REST install succeeds and the fallback is not used.
  • npm run test:unit -- routes/connectors-home: 7 tests pass.

I found three issues:

  1. The button can stay on "Installing…". installPluginViaWpUpdates() only settles on wp-plugin-install-success, wp-plugin-install-error or credential-modal-cancel. Core's wp.updates.installPluginError() returns early when isValidResponse() fails, without firing wp-plugin-install-error. I reproduced it two ways: an expired nonce (wp.updates.ajaxNonce = 'x' in the console, so admin-ajax returns 403 -1), and an install request that returns an HTML 500 page, as a PHP fatal error or a host timeout would. In both cases core adds an "Installation failed" notice that is not visible on this screen, and the button was still on "Installing…" after 30 seconds. With the same HTML 500, Plugins > Add Plugin shows the notice and marks the button as failed.

  2. The modal opens with an error already shown. The first admin-ajax request goes out with empty credentials and returns unable_to_connect_to_filesystem, so the modal opens with "Unable to connect to the filesystem. Please confirm your credentials." before anything is typed. Plugins > Add Plugin calls wp.updates.requestFilesystemCredentials( event ) before installPlugin(), so its modal opens empty and nothing is sent until Proceed.

  3. Focus is lost when the modal closes. After Cancel, Escape or Proceed, focus goes to <body>. On Add Plugin it returns to the Install Now button, because the click event is passed to requestFilesystemCredentials().

For 2 and 3, I tried calling wp.updates.requestFilesystemCredentials( { target: document.activeElement } ) before installPlugin(), patched from the console, only when shouldRequestFilesystemCredentials is true and ajaxLocked is false. The modal opened empty with no request sent, Escape returned focus to the Install button, and Proceed installed the plugin with a single admin-ajax request.

@jeffpaul

Copy link
Copy Markdown
Member

@jorgefilipecosta @westonruter this looks to be the remaining Connectors-related item slated for 7.2, so I'm checking in to see what this additionally needs to be ready for commit?

@ekamran

ekamran commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

Hi Jeff, from the testing side, this is what is still open.

On this PR: the fs_unavailable approach works, but the three issues from my earlier comment are still open, as the head (cc37947) has not changed since I tested it. The one I would fix before commit is the button staying on "Installing…" when admin-ajax returns an invalid response, such as an expired nonce or an HTML 500 from a fatal error or host timeout. Core's wp.updates.installPluginError() in trunk still returns early in that case without firing wp-plugin-install-error, so the install promise never settles. The other two (the modal opening with an error already shown, and focus going to <body> when it closes) have a small fix in the same comment that I tested from the console.

The branch also needs a trunk merge: the "Required changes from trunk" check is failing.

On the core side, WordPress/wordpress-develop#13953 still adds the filesystemCredentialsRequired flag and its three tests. With the fs_unavailable approach they are not needed, as comment:25 on the ticket says. Only the options-connectors.php part is needed, and I tested that combination in comment:26. Neither PR has an approving review yet.

Happy to re-test both with the FTP setup once they are updated.

Comment thread lib/compat/plugin/connectors.php Resolved
t-hamano

This comment was marked as abuse.

@t-hamano t-hamano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestions to fix the button getting stuck on "Installing…" when admin-ajax returns an invalid response, reported in #78367 (comment).

…nses

Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>

@t-hamano t-hamano left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggestions to fix the remaining issues reported in #78367 (comment): the button still getting stuck on "Installing…" after credentials are entered, the modal opening with an error already shown, and focus being lost when the modal closes.

t-hamano and others added 3 commits November 11, 2026 12:33
…sponses

Co-authored-by: Aki Hamano <54422211+t-hamano@users.noreply.github.com>
…he active element

Co-authored-by: t-hamano <54422211+t-hamano@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011g9URwXY34pb67XjPhYPjQ
@t-hamano

Copy link
Copy Markdown
Contributor

49ca8c3 fixes the lint error from @wordpress/no-global-active-element in the previous commit.

Instead of reading document.activeElement, the install button that was clicked is now passed to installPluginViaWpUpdates(), so focus goes back to that button when the credentials modal closes. The button is read from event.currentTarget before the first await, because React clears currentTarget once the click handler returns.

claude and others added 2 commits November 11, 2026 04:03
Co-authored-by: t-hamano <54422211+t-hamano@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011g9URwXY34pb67XjPhYPjQ
Co-authored-by: t-hamano <54422211+t-hamano@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011g9URwXY34pb67XjPhYPjQ
@t-hamano

Copy link
Copy Markdown
Contributor

I believe all the issues raised here have now been addressed.

Also, since the implementation changed from exposing a filesystemCredentialsRequired flag from the server to falling back to wp.updates.installPlugin() when the REST API returns fs_unavailable, the core changes are now minimal. I've submitted a new core PR for this, WordPress/wordpress-develop#15889, and linked it to this PR.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Connectors screen Tracks connectors screen related tasks [Type] Bug An existing feature does not function as intended

Projects

Status: 🔎 Needs Review

Development

Successfully merging this pull request may close these issues.

7 participants