Skip to content

Conversation

@getdave
Copy link
Contributor

@getdave getdave commented Nov 21, 2025

What

Adds real-time URL validation to the LinkControl component to prevent invalid URLs from being submitted. Validation errors are displayed immediately when users attempt to submit invalid URLs, providing clear feedback without requiring form submission.

Closes #73289

Why

Previously, LinkControl allowed users to submit invalid URLs (e.g., "flibble", incomplete URLs, or malformed strings) without validation.

This lead to broken links being saved. The component now validates URLs before they are accepted, improving data quality and user experience.

How

  • Validation only runs on submit - allows for searching UX
  • Validates URLs before selection is processed using isURLLike() and the native URL constructor
  • Displays validation errors immediately using the Constraint Validation API
  • Supports hash links (e.g., #section) as valid internal anchor links
  • Supports relative links (e.g. /internal-link, ../back-a-level)
  • Skips validation for entity suggestions (posts, pages, categories) from the database
  • Suppresses the "(Required)" indicator to reduce UI clutter while maintaining validation

Validation Philosophy:

The validation intentionally allows some URLs that may appear invalid (e.g., "www.wordpress" without a TLD) to pass validation. This is because implementing strict TLD validation or other domain-specific checks risks blocking valid URLs that users may need to create. The native URL constructor is used as the authoritative source for URL validity - if it accepts a URL, we allow it to maintain compatibility with web standards.

For edge cases where external links may resolve to 404s or other issues, we suggest leveraging the LinkPreview work in #73830 to communicate these issues to users after link creation.

Testing

  1. Enter an invalid URL like "www.wordp" and press Enter - validation error should appear immediately
  2. Enter a valid URL like "https://wordpress.org" - should be accepted
  3. Enter a hash link like "#section" - should be accepted
  4. Enter a relative link like "/about" - should be accepted
  5. Select an entity suggestion (post/page) from dropdown - should bypass validation
  6. Enter an incomplete URL and click "Apply" - validation error should appear

@getdave getdave self-assigned this Nov 21, 2025
@github-actions
Copy link

github-actions bot commented Nov 21, 2025

Size Change: +363 B (+0.01%)

Total Size: 3 MB

Filename Size Change
build/scripts/block-editor/index.min.js 326 kB +363 B (+0.11%)
ℹ️ View Unchanged
Filename Size
build/modules/a11y/index.min.js 355 B
build/modules/abilities/index.min.js 42.3 kB
build/modules/block-editor/utils/fit-text-frontend.min.js 617 B
build/modules/block-library/accordion/view.min.js 779 B
build/modules/block-library/file/view.min.js 346 B
build/modules/block-library/form/view.min.js 528 B
build/modules/block-library/image/view.min.js 1.95 kB
build/modules/block-library/navigation/view.min.js 1.12 kB
build/modules/block-library/playlist/view.min.js 418 B
build/modules/block-library/query/view.min.js 518 B
build/modules/block-library/search/view.min.js 498 B
build/modules/block-library/tabs/view.min.js 859 B
build/modules/boot/index.min.js 14.6 kB
build/modules/core-abilities/index.min.js 892 B
build/modules/edit-site-init/index.min.js 2.14 kB
build/modules/interactivity-router/full-page.min.js 451 B
build/modules/interactivity-router/index.min.js 11.6 kB
build/modules/interactivity/index.min.js 15 kB
build/modules/latex-to-mathml/index.min.js 56.5 kB
build/modules/latex-to-mathml/loader.min.js 131 B
build/modules/lazy-editor/index.min.js 13.1 kB
build/modules/route/index.min.js 24.6 kB
build/modules/workflow/index.min.js 19.9 kB
build/scripts/a11y/index.min.js 1.06 kB
build/scripts/annotations/index.min.js 2.39 kB
build/scripts/api-fetch/index.min.js 2.83 kB
build/scripts/autop/index.min.js 2.18 kB
build/scripts/base-styles/index.min.js 98 B
build/scripts/blob/index.min.js 631 B
build/scripts/block-directory/index.min.js 8.04 kB
build/scripts/block-library/index.min.js 304 kB
build/scripts/block-serialization-default-parser/index.min.js 1.16 kB
build/scripts/block-serialization-spec-parser/index.min.js 3.08 kB
build/scripts/blocks/index.min.js 56.7 kB
build/scripts/commands/index.min.js 19.9 kB
build/scripts/components/index.min.js 266 kB
build/scripts/compose/index.min.js 13.9 kB
build/scripts/core-commands/index.min.js 4.3 kB
build/scripts/core-data/index.min.js 65.3 kB
build/scripts/customize-widgets/index.min.js 12.3 kB
build/scripts/data-controls/index.min.js 795 B
build/scripts/data/index.min.js 9.64 kB
build/scripts/date/index.min.js 23.6 kB
build/scripts/deprecated/index.min.js 756 B
build/scripts/dom-ready/index.min.js 476 B
build/scripts/dom/index.min.js 4.91 kB
build/scripts/edit-post/index.min.js 16.4 kB
build/scripts/edit-site/index.min.js 243 kB
build/scripts/edit-widgets/index.min.js 20 kB
build/scripts/editor/index.min.js 320 kB
build/scripts/element/index.min.js 5.2 kB
build/scripts/escape-html/index.min.js 587 B
build/scripts/format-library/index.min.js 10.8 kB
build/scripts/hooks/index.min.js 1.83 kB
build/scripts/html-entities/index.min.js 494 B
build/scripts/i18n/index.min.js 2.46 kB
build/scripts/is-shallow-equal/index.min.js 572 B
build/scripts/keyboard-shortcuts/index.min.js 1.57 kB
build/scripts/keycodes/index.min.js 1.56 kB
build/scripts/list-reusable-blocks/index.min.js 2.44 kB
build/scripts/media-utils/index.min.js 73.4 kB
build/scripts/notices/index.min.js 1.12 kB
build/scripts/nux/index.min.js 1.89 kB
build/scripts/patterns/index.min.js 7.75 kB
build/scripts/plugins/index.min.js 2.15 kB
build/scripts/preferences-persistence/index.min.js 2.15 kB
build/scripts/preferences/index.min.js 3.3 kB
build/scripts/primitives/index.min.js 1.01 kB
build/scripts/priority-queue/index.min.js 1.62 kB
build/scripts/private-apis/index.min.js 1.08 kB
build/scripts/react-i18n/index.min.js 833 B
build/scripts/redux-routine/index.min.js 3.37 kB
build/scripts/reusable-blocks/index.min.js 2.92 kB
build/scripts/rich-text/index.min.js 12.9 kB
build/scripts/router/index.min.js 5.96 kB
build/scripts/server-side-render/index.min.js 1.91 kB
build/scripts/shortcode/index.min.js 1.59 kB
build/scripts/style-engine/index.min.js 2.35 kB
build/scripts/theme/index.min.js 21.9 kB
build/scripts/token-list/index.min.js 739 B
build/scripts/undo-manager/index.min.js 918 B
build/scripts/url/index.min.js 3.98 kB
build/scripts/vendors/react-dom.min.js 43 kB
build/scripts/vendors/react-jsx-runtime.min.js 691 B
build/scripts/vendors/react.min.js 4.27 kB
build/scripts/viewport/index.min.js 1.21 kB
build/scripts/warning/index.min.js 454 B
build/scripts/widgets/index.min.js 7.81 kB
build/scripts/wordcount/index.min.js 1.04 kB
build/styles/base-styles/admin-schemes-rtl.css 1.71 kB
build/styles/base-styles/admin-schemes-rtl.min.css 775 B
build/styles/base-styles/admin-schemes.css 1.71 kB
build/styles/base-styles/admin-schemes.min.css 775 B
build/styles/block-directory/style-rtl.css 1.96 kB
build/styles/block-directory/style-rtl.min.css 1.05 kB
build/styles/block-directory/style.css 1.97 kB
build/styles/block-directory/style.min.css 1.05 kB
build/styles/block-editor/content-rtl.css 5.47 kB
build/styles/block-editor/content-rtl.min.css 4.04 kB
build/styles/block-editor/content.css 5.46 kB
build/styles/block-editor/content.min.css 4.03 kB
build/styles/block-editor/default-editor-styles-rtl.css 697 B
build/styles/block-editor/default-editor-styles-rtl.min.css 224 B
build/styles/block-editor/default-editor-styles.css 697 B
build/styles/block-editor/default-editor-styles.min.css 224 B
build/styles/block-editor/style-rtl.css 18.3 kB
build/styles/block-editor/style-rtl.min.css 15.7 kB
build/styles/block-editor/style.css 18.3 kB
build/styles/block-editor/style.min.css 15.7 kB
build/styles/block-library/accordion-heading/style-rtl.css 346 B
build/styles/block-library/accordion-heading/style-rtl.min.css 325 B
build/styles/block-library/accordion-heading/style.css 346 B
build/styles/block-library/accordion-heading/style.min.css 325 B
build/styles/block-library/accordion-item/style-rtl.css 239 B
build/styles/block-library/accordion-item/style-rtl.min.css 180 B
build/styles/block-library/accordion-item/style.css 238 B
build/styles/block-library/accordion-item/style.min.css 180 B
build/styles/block-library/accordion-panel/style-rtl.css 110 B
build/styles/block-library/accordion-panel/style-rtl.min.css 99 B
build/styles/block-library/accordion-panel/style.css 110 B
build/styles/block-library/accordion-panel/style.min.css 99 B
build/styles/block-library/accordion/style-rtl.css 69 B
build/styles/block-library/accordion/style-rtl.min.css 62 B
build/styles/block-library/accordion/style.css 69 B
build/styles/block-library/accordion/style.min.css 62 B
build/styles/block-library/archives/style-rtl.css 101 B
build/styles/block-library/archives/style-rtl.min.css 90 B
build/styles/block-library/archives/style.css 101 B
build/styles/block-library/archives/style.min.css 90 B
build/styles/block-library/audio/editor-rtl.css 166 B
build/styles/block-library/audio/editor-rtl.min.css 149 B
build/styles/block-library/audio/editor.css 166 B
build/styles/block-library/audio/editor.min.css 151 B
build/styles/block-library/audio/style-rtl.css 945 B
build/styles/block-library/audio/style-rtl.min.css 132 B
build/styles/block-library/audio/style.css 945 B
build/styles/block-library/audio/style.min.css 132 B
build/styles/block-library/audio/theme-rtl.css 967 B
build/styles/block-library/audio/theme-rtl.min.css 134 B
build/styles/block-library/audio/theme.css 967 B
build/styles/block-library/audio/theme.min.css 134 B
build/styles/block-library/avatar/editor-rtl.css 127 B
build/styles/block-library/avatar/editor-rtl.min.css 115 B
build/styles/block-library/avatar/editor.css 127 B
build/styles/block-library/avatar/editor.min.css 115 B
build/styles/block-library/avatar/style-rtl.css 117 B
build/styles/block-library/avatar/style-rtl.min.css 104 B
build/styles/block-library/avatar/style.css 117 B
build/styles/block-library/avatar/style.min.css 104 B
build/styles/block-library/breadcrumbs/style-rtl.css 233 B
build/styles/block-library/breadcrumbs/style-rtl.min.css 203 B
build/styles/block-library/breadcrumbs/style.css 233 B
build/styles/block-library/breadcrumbs/style.min.css 203 B
build/styles/block-library/button/editor-rtl.css 306 B
build/styles/block-library/button/editor-rtl.min.css 265 B
build/styles/block-library/button/editor.css 317 B
build/styles/block-library/button/editor.min.css 265 B
build/styles/block-library/button/style-rtl.css 609 B
build/styles/block-library/button/style-rtl.min.css 554 B
build/styles/block-library/button/style.css 622 B
build/styles/block-library/button/style.min.css 554 B
build/styles/block-library/buttons/editor-rtl.css 391 B
build/styles/block-library/buttons/editor-rtl.min.css 291 B
build/styles/block-library/buttons/editor.css 391 B
build/styles/block-library/buttons/editor.min.css 291 B
build/styles/block-library/buttons/style-rtl.css 452 B
build/styles/block-library/buttons/style-rtl.min.css 349 B
build/styles/block-library/buttons/style.css 453 B
build/styles/block-library/buttons/style.min.css 349 B
build/styles/block-library/calendar/style-rtl.css 271 B
build/styles/block-library/calendar/style-rtl.min.css 239 B
build/styles/block-library/calendar/style.css 271 B
build/styles/block-library/calendar/style.min.css 239 B
build/styles/block-library/categories/editor-rtl.css 171 B
build/styles/block-library/categories/editor-rtl.min.css 132 B
build/styles/block-library/categories/editor.css 170 B
build/styles/block-library/categories/editor.min.css 131 B
build/styles/block-library/categories/style-rtl.css 226 B
build/styles/block-library/categories/style-rtl.min.css 169 B
build/styles/block-library/categories/style.css 235 B
build/styles/block-library/categories/style.min.css 169 B
build/styles/block-library/classic-rtl.css 363 B
build/styles/block-library/classic-rtl.min.css 321 B
build/styles/block-library/classic.css 363 B
build/styles/block-library/classic.min.css 321 B
build/styles/block-library/code/editor-rtl.css 59 B
build/styles/block-library/code/editor-rtl.min.css 53 B
build/styles/block-library/code/editor.css 59 B
build/styles/block-library/code/editor.min.css 53 B
build/styles/block-library/code/style-rtl.css 158 B
build/styles/block-library/code/style-rtl.min.css 139 B
build/styles/block-library/code/style.css 179 B
build/styles/block-library/code/style.min.css 139 B
build/styles/block-library/code/theme-rtl.css 135 B
build/styles/block-library/code/theme-rtl.min.css 122 B
build/styles/block-library/code/theme.css 135 B
build/styles/block-library/code/theme.min.css 122 B
build/styles/block-library/columns/editor-rtl.css 119 B
build/styles/block-library/columns/editor-rtl.min.css 108 B
build/styles/block-library/columns/editor.css 119 B
build/styles/block-library/columns/editor.min.css 108 B
build/styles/block-library/columns/style-rtl.css 1.3 kB
build/styles/block-library/columns/style-rtl.min.css 421 B
build/styles/block-library/columns/style.css 1.3 kB
build/styles/block-library/columns/style.min.css 421 B
build/styles/block-library/comment-author-avatar/editor-rtl.css 136 B
build/styles/block-library/comment-author-avatar/editor-rtl.min.css 124 B
build/styles/block-library/comment-author-avatar/editor.css 136 B
build/styles/block-library/comment-author-avatar/editor.min.css 124 B
build/styles/block-library/comment-author-name/style-rtl.css 79 B
build/styles/block-library/comment-author-name/style-rtl.min.css 72 B
build/styles/block-library/comment-author-name/style.css 79 B
build/styles/block-library/comment-author-name/style.min.css 72 B
build/styles/block-library/comment-content/style-rtl.css 137 B
build/styles/block-library/comment-content/style-rtl.min.css 120 B
build/styles/block-library/comment-content/style.css 137 B
build/styles/block-library/comment-content/style.min.css 120 B
build/styles/block-library/comment-date/style-rtl.css 72 B
build/styles/block-library/comment-date/style-rtl.min.css 65 B
build/styles/block-library/comment-date/style.css 72 B
build/styles/block-library/comment-date/style.min.css 65 B
build/styles/block-library/comment-edit-link/style-rtl.css 77 B
build/styles/block-library/comment-edit-link/style-rtl.min.css 70 B
build/styles/block-library/comment-edit-link/style.css 77 B
build/styles/block-library/comment-edit-link/style.min.css 70 B
build/styles/block-library/comment-reply-link/style-rtl.css 78 B
build/styles/block-library/comment-reply-link/style-rtl.min.css 71 B
build/styles/block-library/comment-reply-link/style.css 78 B
build/styles/block-library/comment-reply-link/style.min.css 71 B
build/styles/block-library/comment-template/style-rtl.css 213 B
build/styles/block-library/comment-template/style-rtl.min.css 191 B
build/styles/block-library/comment-template/style.css 213 B
build/styles/block-library/comment-template/style.min.css 191 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.css 135 B
build/styles/block-library/comments-pagination-numbers/editor-rtl.min.css 122 B
build/styles/block-library/comments-pagination-numbers/editor.css 144 B
build/styles/block-library/comments-pagination-numbers/editor.min.css 121 B
build/styles/block-library/comments-pagination/editor-rtl.css 184 B
build/styles/block-library/comments-pagination/editor-rtl.min.css 168 B
build/styles/block-library/comments-pagination/editor.css 184 B
build/styles/block-library/comments-pagination/editor.min.css 168 B
build/styles/block-library/comments-pagination/style-rtl.css 224 B
build/styles/block-library/comments-pagination/style-rtl.min.css 201 B
build/styles/block-library/comments-pagination/style.css 236 B
build/styles/block-library/comments-pagination/style.min.css 201 B
build/styles/block-library/comments-title/editor-rtl.css 83 B
build/styles/block-library/comments-title/editor-rtl.min.css 75 B
build/styles/block-library/comments-title/editor.css 83 B
build/styles/block-library/comments-title/editor.min.css 75 B
build/styles/block-library/comments/editor-rtl.css 968 B
build/styles/block-library/comments/editor-rtl.min.css 842 B
build/styles/block-library/comments/editor.css 968 B
build/styles/block-library/comments/editor.min.css 842 B
build/styles/block-library/comments/style-rtl.css 754 B
build/styles/block-library/comments/style-rtl.min.css 637 B
build/styles/block-library/comments/style.css 752 B
build/styles/block-library/comments/style.min.css 637 B
build/styles/block-library/common-rtl.css 2.48 kB
build/styles/block-library/common-rtl.min.css 1.11 kB
build/styles/block-library/common.css 2.49 kB
build/styles/block-library/common.min.css 1.11 kB
build/styles/block-library/cover/editor-rtl.css 1.05 kB
build/styles/block-library/cover/editor-rtl.min.css 631 B
build/styles/block-library/cover/editor.css 1.05 kB
build/styles/block-library/cover/editor.min.css 631 B
build/styles/block-library/cover/style-rtl.css 2.5 kB
build/styles/block-library/cover/style-rtl.min.css 1.82 kB
build/styles/block-library/cover/style.css 2.51 kB
build/styles/block-library/cover/style.min.css 1.81 kB
build/styles/block-library/details/editor-rtl.css 72 B
build/styles/block-library/details/editor-rtl.min.css 65 B
build/styles/block-library/details/editor.css 72 B
build/styles/block-library/details/editor.min.css 65 B
build/styles/block-library/details/style-rtl.css 97 B
build/styles/block-library/details/style-rtl.min.css 86 B
build/styles/block-library/details/style.css 97 B
build/styles/block-library/details/style.min.css 86 B
build/styles/block-library/editor-elements-rtl.css 117 B
build/styles/block-library/editor-elements-rtl.min.css 75 B
build/styles/block-library/editor-elements.css 117 B
build/styles/block-library/editor-elements.min.css 75 B
build/styles/block-library/editor-rtl.css 12.3 kB
build/styles/block-library/editor-rtl.min.css 10.1 kB
build/styles/block-library/editor.css 12.3 kB
build/styles/block-library/editor.min.css 10.1 kB
build/styles/block-library/elements-rtl.css 84 B
build/styles/block-library/elements-rtl.min.css 54 B
build/styles/block-library/elements.css 84 B
build/styles/block-library/elements.min.css 54 B
build/styles/block-library/embed/editor-rtl.css 391 B
build/styles/block-library/embed/editor-rtl.min.css 331 B
build/styles/block-library/embed/editor.css 390 B
build/styles/block-library/embed/editor.min.css 331 B
build/styles/block-library/embed/style-rtl.css 1.29 kB
build/styles/block-library/embed/style-rtl.min.css 448 B
build/styles/block-library/embed/style.css 1.29 kB
build/styles/block-library/embed/style.min.css 448 B
build/styles/block-library/embed/theme-rtl.css 967 B
build/styles/block-library/embed/theme-rtl.min.css 133 B
build/styles/block-library/embed/theme.css 967 B
build/styles/block-library/embed/theme.min.css 133 B
build/styles/block-library/file/editor-rtl.css 352 B
build/styles/block-library/file/editor-rtl.min.css 324 B
build/styles/block-library/file/editor.css 353 B
build/styles/block-library/file/editor.min.css 324 B
build/styles/block-library/file/style-rtl.css 318 B
build/styles/block-library/file/style-rtl.min.css 278 B
build/styles/block-library/file/style.css 331 B
build/styles/block-library/file/style.min.css 278 B
build/styles/block-library/footnotes/style-rtl.css 220 B
build/styles/block-library/footnotes/style-rtl.min.css 198 B
build/styles/block-library/footnotes/style.css 219 B
build/styles/block-library/footnotes/style.min.css 197 B
build/styles/block-library/form-input/editor-rtl.css 247 B
build/styles/block-library/form-input/editor-rtl.min.css 229 B
build/styles/block-library/form-input/editor.css 246 B
build/styles/block-library/form-input/editor.min.css 229 B
build/styles/block-library/form-input/style-rtl.css 467 B
build/styles/block-library/form-input/style-rtl.min.css 366 B
build/styles/block-library/form-input/style.css 467 B
build/styles/block-library/form-input/style.min.css 366 B
build/styles/block-library/form-submission-notification/editor-rtl.css 368 B
build/styles/block-library/form-submission-notification/editor-rtl.min.css 344 B
build/styles/block-library/form-submission-notification/editor.css 368 B
build/styles/block-library/form-submission-notification/editor.min.css 341 B
build/styles/block-library/form-submit-button/style-rtl.css 77 B
build/styles/block-library/form-submit-button/style-rtl.min.css 69 B
build/styles/block-library/form-submit-button/style.css 77 B
build/styles/block-library/form-submit-button/style.min.css 69 B
build/styles/block-library/freeform/editor-rtl.css 1.12 kB
build/styles/block-library/freeform/editor-rtl.min.css 288 B
build/styles/block-library/freeform/editor.css 1.12 kB
build/styles/block-library/freeform/editor.min.css 288 B
build/styles/block-library/gallery/editor-rtl.css 1.52 kB
build/styles/block-library/gallery/editor-rtl.min.css 615 B
build/styles/block-library/gallery/editor.css 1.52 kB
build/styles/block-library/gallery/editor.min.css 616 B
build/styles/block-library/gallery/style-rtl.css 2.84 kB
build/styles/block-library/gallery/style-rtl.min.css 1.84 kB
build/styles/block-library/gallery/style.css 2.84 kB
build/styles/block-library/gallery/style.min.css 1.84 kB
build/styles/block-library/gallery/theme-rtl.css 941 B
build/styles/block-library/gallery/theme-rtl.min.css 108 B
build/styles/block-library/gallery/theme.css 941 B
build/styles/block-library/gallery/theme.min.css 108 B
build/styles/block-library/group/editor-rtl.css 772 B
build/styles/block-library/group/editor-rtl.min.css 335 B
build/styles/block-library/group/editor.css 772 B
build/styles/block-library/group/editor.min.css 335 B
build/styles/block-library/group/style-rtl.css 120 B
build/styles/block-library/group/style-rtl.min.css 103 B
build/styles/block-library/group/style.css 120 B
build/styles/block-library/group/style.min.css 103 B
build/styles/block-library/group/theme-rtl.css 468 B
build/styles/block-library/group/theme-rtl.min.css 79 B
build/styles/block-library/group/theme.css 468 B
build/styles/block-library/group/theme.min.css 79 B
build/styles/block-library/heading/style-rtl.css 604 B
build/styles/block-library/heading/style-rtl.min.css 205 B
build/styles/block-library/heading/style.css 604 B
build/styles/block-library/heading/style.min.css 205 B
build/styles/block-library/html/editor-rtl.css 1.24 kB
build/styles/block-library/html/editor-rtl.min.css 419 B
build/styles/block-library/html/editor.css 1.25 kB
build/styles/block-library/html/editor.min.css 419 B
build/styles/block-library/image/editor-rtl.css 1.63 kB
build/styles/block-library/image/editor-rtl.min.css 763 B
build/styles/block-library/image/editor.css 1.62 kB
build/styles/block-library/image/editor.min.css 763 B
build/styles/block-library/image/style-rtl.css 2.63 kB
build/styles/block-library/image/style-rtl.min.css 1.6 kB
build/styles/block-library/image/style.css 2.63 kB
build/styles/block-library/image/style.min.css 1.59 kB
build/styles/block-library/image/theme-rtl.css 971 B
build/styles/block-library/image/theme-rtl.min.css 137 B
build/styles/block-library/image/theme.css 971 B
build/styles/block-library/image/theme.min.css 137 B
build/styles/block-library/latest-comments/style-rtl.css 394 B
build/styles/block-library/latest-comments/style-rtl.min.css 355 B
build/styles/block-library/latest-comments/style.css 394 B
build/styles/block-library/latest-comments/style.min.css 354 B
build/styles/block-library/latest-posts/editor-rtl.css 154 B
build/styles/block-library/latest-posts/editor-rtl.min.css 139 B
build/styles/block-library/latest-posts/editor.css 153 B
build/styles/block-library/latest-posts/editor.min.css 138 B
build/styles/block-library/latest-posts/style-rtl.css 1.36 kB
build/styles/block-library/latest-posts/style-rtl.min.css 520 B
build/styles/block-library/latest-posts/style.css 1.37 kB
build/styles/block-library/latest-posts/style.min.css 520 B
build/styles/block-library/list/style-rtl.css 498 B
build/styles/block-library/list/style-rtl.min.css 107 B
build/styles/block-library/list/style.css 498 B
build/styles/block-library/list/style.min.css 107 B
build/styles/block-library/loginout/style-rtl.css 68 B
build/styles/block-library/loginout/style-rtl.min.css 61 B
build/styles/block-library/loginout/style.css 68 B
build/styles/block-library/loginout/style.min.css 61 B
build/styles/block-library/math/editor-rtl.css 491 B
build/styles/block-library/math/editor-rtl.min.css 105 B
build/styles/block-library/math/editor.css 502 B
build/styles/block-library/math/editor.min.css 105 B
build/styles/block-library/math/style-rtl.css 70 B
build/styles/block-library/math/style-rtl.min.css 61 B
build/styles/block-library/math/style.css 70 B
build/styles/block-library/math/style.min.css 61 B
build/styles/block-library/media-text/editor-rtl.css 389 B
build/styles/block-library/media-text/editor-rtl.min.css 321 B
build/styles/block-library/media-text/editor.css 389 B
build/styles/block-library/media-text/editor.min.css 320 B
build/styles/block-library/media-text/style-rtl.css 873 B
build/styles/block-library/media-text/style-rtl.min.css 552 B
build/styles/block-library/media-text/style.css 903 B
build/styles/block-library/media-text/style.min.css 550 B
build/styles/block-library/more/editor-rtl.css 796 B
build/styles/block-library/more/editor-rtl.min.css 393 B
build/styles/block-library/more/editor.css 798 B
build/styles/block-library/more/editor.min.css 393 B
build/styles/block-library/navigation-link/editor-rtl.css 1.21 kB
build/styles/block-library/navigation-link/editor-rtl.min.css 645 B
build/styles/block-library/navigation-link/editor.css 1.21 kB
build/styles/block-library/navigation-link/editor.min.css 647 B
build/styles/block-library/navigation-link/style-rtl.css 579 B
build/styles/block-library/navigation-link/style-rtl.min.css 190 B
build/styles/block-library/navigation-link/style.css 579 B
build/styles/block-library/navigation-link/style.min.css 188 B
build/styles/block-library/navigation-overlay-close/style-rtl.css 257 B
build/styles/block-library/navigation-overlay-close/style-rtl.min.css 236 B
build/styles/block-library/navigation-overlay-close/style.css 257 B
build/styles/block-library/navigation-overlay-close/style.min.css 236 B
build/styles/block-library/navigation-submenu/editor-rtl.css 1.12 kB
build/styles/block-library/navigation-submenu/editor-rtl.min.css 295 B
build/styles/block-library/navigation-submenu/editor.css 1.12 kB
build/styles/block-library/navigation-submenu/editor.min.css 294 B
build/styles/block-library/navigation/editor-rtl.css 3.45 kB
build/styles/block-library/navigation/editor-rtl.min.css 2.44 kB
build/styles/block-library/navigation/editor.css 3.45 kB
build/styles/block-library/navigation/editor.min.css 2.44 kB
build/styles/block-library/navigation/style-rtl.css 3.54 kB
build/styles/block-library/navigation/style-rtl.min.css 2.48 kB
build/styles/block-library/navigation/style.css 3.54 kB
build/styles/block-library/navigation/style.min.css 2.48 kB
build/styles/block-library/nextpage/editor-rtl.css 799 B
build/styles/block-library/nextpage/editor-rtl.min.css 392 B
build/styles/block-library/nextpage/editor.css 800 B
build/styles/block-library/nextpage/editor.min.css 392 B
build/styles/block-library/page-list/editor-rtl.css 1.18 kB
build/styles/block-library/page-list/editor-rtl.min.css 356 B
build/styles/block-library/page-list/editor.css 1.18 kB
build/styles/block-library/page-list/editor.min.css 356 B
build/styles/block-library/page-list/style-rtl.css 207 B
build/styles/block-library/page-list/style-rtl.min.css 192 B
build/styles/block-library/page-list/style.css 207 B
build/styles/block-library/page-list/style.min.css 192 B
build/styles/block-library/paragraph/editor-rtl.css 315 B
build/styles/block-library/paragraph/editor-rtl.min.css 292 B
build/styles/block-library/paragraph/editor.css 314 B
build/styles/block-library/paragraph/editor.min.css 292 B
build/styles/block-library/paragraph/style-rtl.css 746 B
build/styles/block-library/paragraph/style-rtl.min.css 341 B
build/styles/block-library/paragraph/style.css 752 B
build/styles/block-library/paragraph/style.min.css 340 B
build/styles/block-library/playlist-track/style-rtl.css 706 B
build/styles/block-library/playlist-track/style-rtl.min.css 303 B
build/styles/block-library/playlist-track/style.css 706 B
build/styles/block-library/playlist-track/style.min.css 304 B
build/styles/block-library/playlist/editor-rtl.css 84 B
build/styles/block-library/playlist/editor-rtl.min.css 73 B
build/styles/block-library/playlist/editor.css 84 B
build/styles/block-library/playlist/editor.min.css 73 B
build/styles/block-library/playlist/style-rtl.css 829 B
build/styles/block-library/playlist/style-rtl.min.css 443 B
build/styles/block-library/playlist/style.css 830 B
build/styles/block-library/playlist/style.min.css 443 B
build/styles/block-library/post-author-biography/style-rtl.css 81 B
build/styles/block-library/post-author-biography/style-rtl.min.css 74 B
build/styles/block-library/post-author-biography/style.css 81 B
build/styles/block-library/post-author-biography/style.min.css 74 B
build/styles/block-library/post-author-name/style-rtl.css 76 B
build/styles/block-library/post-author-name/style-rtl.min.css 69 B
build/styles/block-library/post-author-name/style.css 76 B
build/styles/block-library/post-author-name/style.min.css 69 B
build/styles/block-library/post-author/editor-rtl.css 490 B
build/styles/block-library/post-author/editor-rtl.min.css 104 B
build/styles/block-library/post-author/editor.css 490 B
build/styles/block-library/post-author/editor.min.css 104 B
build/styles/block-library/post-author/style-rtl.css 213 B
build/styles/block-library/post-author/style-rtl.min.css 188 B
build/styles/block-library/post-author/style.css 214 B
build/styles/block-library/post-author/style.min.css 189 B
build/styles/block-library/post-comments-count/style-rtl.css 79 B
build/styles/block-library/post-comments-count/style-rtl.min.css 72 B
build/styles/block-library/post-comments-count/style.css 79 B
build/styles/block-library/post-comments-count/style.min.css 72 B
build/styles/block-library/post-comments-form/editor-rtl.css 104 B
build/styles/block-library/post-comments-form/editor-rtl.min.css 96 B
build/styles/block-library/post-comments-form/editor.css 104 B
build/styles/block-library/post-comments-form/editor.min.css 96 B
build/styles/block-library/post-comments-form/style-rtl.css 585 B
build/styles/block-library/post-comments-form/style-rtl.min.css 525 B
build/styles/block-library/post-comments-form/style.css 584 B
build/styles/block-library/post-comments-form/style.min.css 525 B
build/styles/block-library/post-comments-link/style-rtl.css 78 B
build/styles/block-library/post-comments-link/style-rtl.min.css 71 B
build/styles/block-library/post-comments-link/style.css 78 B
build/styles/block-library/post-comments-link/style.min.css 71 B
build/styles/block-library/post-content/style-rtl.css 68 B
build/styles/block-library/post-content/style-rtl.min.css 61 B
build/styles/block-library/post-content/style.css 68 B
build/styles/block-library/post-content/style.min.css 61 B
build/styles/block-library/post-date/style-rtl.css 69 B
build/styles/block-library/post-date/style-rtl.min.css 62 B
build/styles/block-library/post-date/style.css 69 B
build/styles/block-library/post-date/style.min.css 62 B
build/styles/block-library/post-excerpt/editor-rtl.css 78 B
build/styles/block-library/post-excerpt/editor-rtl.min.css 71 B
build/styles/block-library/post-excerpt/editor.css 78 B
build/styles/block-library/post-excerpt/editor.min.css 71 B
build/styles/block-library/post-excerpt/style-rtl.css 171 B
build/styles/block-library/post-excerpt/style-rtl.min.css 155 B
build/styles/block-library/post-excerpt/style.css 171 B
build/styles/block-library/post-excerpt/style.min.css 155 B
build/styles/block-library/post-featured-image/editor-rtl.css 1.14 kB
build/styles/block-library/post-featured-image/editor-rtl.min.css 719 B
build/styles/block-library/post-featured-image/editor.css 1.14 kB
build/styles/block-library/post-featured-image/editor.min.css 717 B
build/styles/block-library/post-featured-image/style-rtl.css 392 B
build/styles/block-library/post-featured-image/style-rtl.min.css 347 B
build/styles/block-library/post-featured-image/style.css 392 B
build/styles/block-library/post-featured-image/style.min.css 347 B
build/styles/block-library/post-navigation-link/style-rtl.css 234 B
build/styles/block-library/post-navigation-link/style-rtl.min.css 215 B
build/styles/block-library/post-navigation-link/style.css 245 B
build/styles/block-library/post-navigation-link/style.min.css 214 B
build/styles/block-library/post-template/style-rtl.css 1.25 kB
build/styles/block-library/post-template/style-rtl.min.css 414 B
build/styles/block-library/post-template/style.css 1.25 kB
build/styles/block-library/post-template/style.min.css 414 B
build/styles/block-library/post-terms/style-rtl.css 108 B
build/styles/block-library/post-terms/style-rtl.min.css 96 B
build/styles/block-library/post-terms/style.css 108 B
build/styles/block-library/post-terms/style.min.css 96 B
build/styles/block-library/post-time-to-read/style-rtl.css 77 B
build/styles/block-library/post-time-to-read/style-rtl.min.css 70 B
build/styles/block-library/post-time-to-read/style.css 77 B
build/styles/block-library/post-time-to-read/style.min.css 70 B
build/styles/block-library/post-title/style-rtl.css 175 B
build/styles/block-library/post-title/style-rtl.min.css 162 B
build/styles/block-library/post-title/style.css 175 B
build/styles/block-library/post-title/style.min.css 162 B
build/styles/block-library/preformatted/style-rtl.css 511 B
build/styles/block-library/preformatted/style-rtl.min.css 125 B
build/styles/block-library/preformatted/style.css 511 B
build/styles/block-library/preformatted/style.min.css 125 B
build/styles/block-library/pullquote/editor-rtl.css 146 B
build/styles/block-library/pullquote/editor-rtl.min.css 133 B
build/styles/block-library/pullquote/editor.css 146 B
build/styles/block-library/pullquote/editor.min.css 133 B
build/styles/block-library/pullquote/style-rtl.css 765 B
build/styles/block-library/pullquote/style-rtl.min.css 365 B
build/styles/block-library/pullquote/style.css 764 B
build/styles/block-library/pullquote/style.min.css 365 B
build/styles/block-library/pullquote/theme-rtl.css 195 B
build/styles/block-library/pullquote/theme-rtl.min.css 176 B
build/styles/block-library/pullquote/theme.css 195 B
build/styles/block-library/pullquote/theme.min.css 176 B
build/styles/block-library/query-pagination-numbers/editor-rtl.css 134 B
build/styles/block-library/query-pagination-numbers/editor-rtl.min.css 121 B
build/styles/block-library/query-pagination-numbers/editor.css 144 B
build/styles/block-library/query-pagination-numbers/editor.min.css 118 B
build/styles/block-library/query-pagination/editor-rtl.css 168 B
build/styles/block-library/query-pagination/editor-rtl.min.css 154 B
build/styles/block-library/query-pagination/editor.css 168 B
build/styles/block-library/query-pagination/editor.min.css 154 B
build/styles/block-library/query-pagination/style-rtl.css 254 B
build/styles/block-library/query-pagination/style-rtl.min.css 237 B
build/styles/block-library/query-pagination/style.css 265 B
build/styles/block-library/query-pagination/style.min.css 237 B
build/styles/block-library/query-title/style-rtl.css 71 B
build/styles/block-library/query-title/style-rtl.min.css 64 B
build/styles/block-library/query-title/style.css 71 B
build/styles/block-library/query-title/style.min.css 64 B
build/styles/block-library/query-total/style-rtl.css 71 B
build/styles/block-library/query-total/style-rtl.min.css 64 B
build/styles/block-library/query-total/style.css 71 B
build/styles/block-library/query-total/style.min.css 64 B
build/styles/block-library/query/editor-rtl.css 1.28 kB
build/styles/block-library/query/editor-rtl.min.css 438 B
build/styles/block-library/query/editor.css 1.28 kB
build/styles/block-library/query/editor.min.css 438 B
build/styles/block-library/quote/style-rtl.css 255 B
build/styles/block-library/quote/style-rtl.min.css 238 B
build/styles/block-library/quote/style.css 256 B
build/styles/block-library/quote/style.min.css 238 B
build/styles/block-library/quote/theme-rtl.css 253 B
build/styles/block-library/quote/theme-rtl.min.css 233 B
build/styles/block-library/quote/theme.css 254 B
build/styles/block-library/quote/theme.min.css 236 B
build/styles/block-library/read-more/style-rtl.css 146 B
build/styles/block-library/read-more/style-rtl.min.css 131 B
build/styles/block-library/read-more/style.css 146 B
build/styles/block-library/read-more/style.min.css 131 B
build/styles/block-library/reset-rtl.css 936 B
build/styles/block-library/reset-rtl.min.css 467 B
build/styles/block-library/reset.css 936 B
build/styles/block-library/reset.min.css 467 B
build/styles/block-library/rss/editor-rtl.css 144 B
build/styles/block-library/rss/editor-rtl.min.css 126 B
build/styles/block-library/rss/editor.css 144 B
build/styles/block-library/rss/editor.min.css 126 B
build/styles/block-library/rss/style-rtl.css 1.11 kB
build/styles/block-library/rss/style-rtl.min.css 284 B
build/styles/block-library/rss/style.css 1.12 kB
build/styles/block-library/rss/style.min.css 283 B
build/styles/block-library/search/editor-rtl.css 217 B
build/styles/block-library/search/editor-rtl.min.css 199 B
build/styles/block-library/search/editor.css 217 B
build/styles/block-library/search/editor.min.css 199 B
build/styles/block-library/search/style-rtl.css 1.1 kB
build/styles/block-library/search/style-rtl.min.css 665 B
build/styles/block-library/search/style.css 1.1 kB
build/styles/block-library/search/style.min.css 666 B
build/styles/block-library/search/theme-rtl.css 130 B
build/styles/block-library/search/theme-rtl.min.css 113 B
build/styles/block-library/search/theme.css 130 B
build/styles/block-library/search/theme.min.css 113 B
build/styles/block-library/separator/editor-rtl.css 106 B
build/styles/block-library/separator/editor-rtl.min.css 100 B
build/styles/block-library/separator/editor.css 106 B
build/styles/block-library/separator/editor.min.css 100 B
build/styles/block-library/separator/style-rtl.css 284 B
build/styles/block-library/separator/style-rtl.min.css 248 B
build/styles/block-library/separator/style.css 297 B
build/styles/block-library/separator/style.min.css 248 B
build/styles/block-library/separator/theme-rtl.css 226 B
build/styles/block-library/separator/theme-rtl.min.css 195 B
build/styles/block-library/separator/theme.css 226 B
build/styles/block-library/separator/theme.min.css 195 B
build/styles/block-library/shortcode/editor-rtl.css 1.1 kB
build/styles/block-library/shortcode/editor-rtl.min.css 286 B
build/styles/block-library/shortcode/editor.css 1.1 kB
build/styles/block-library/shortcode/editor.min.css 286 B
build/styles/block-library/site-logo/editor-rtl.css 1.12 kB
build/styles/block-library/site-logo/editor-rtl.min.css 696 B
build/styles/block-library/site-logo/editor.css 1.12 kB
build/styles/block-library/site-logo/editor.min.css 692 B
build/styles/block-library/site-logo/style-rtl.css 239 B
build/styles/block-library/site-logo/style-rtl.min.css 218 B
build/styles/block-library/site-logo/style.css 238 B
build/styles/block-library/site-logo/style.min.css 218 B
build/styles/block-library/site-tagline/editor-rtl.css 94 B
build/styles/block-library/site-tagline/editor-rtl.min.css 87 B
build/styles/block-library/site-tagline/editor.css 94 B
build/styles/block-library/site-tagline/editor.min.css 87 B
build/styles/block-library/site-tagline/style-rtl.css 72 B
build/styles/block-library/site-tagline/style-rtl.min.css 65 B
build/styles/block-library/site-tagline/style.css 72 B
build/styles/block-library/site-tagline/style.min.css 65 B
build/styles/block-library/site-title/editor-rtl.css 93 B
build/styles/block-library/site-title/editor-rtl.min.css 85 B
build/styles/block-library/site-title/editor.css 93 B
build/styles/block-library/site-title/editor.min.css 85 B
build/styles/block-library/site-title/style-rtl.css 153 B
build/styles/block-library/site-title/style-rtl.min.css 143 B
build/styles/block-library/site-title/style.css 153 B
build/styles/block-library/site-title/style.min.css 143 B
build/styles/block-library/social-link/editor-rtl.css 346 B
build/styles/block-library/social-link/editor-rtl.min.css 314 B
build/styles/block-library/social-link/editor.css 348 B
build/styles/block-library/social-link/editor.min.css 314 B
build/styles/block-library/social-links/editor-rtl.css 737 B
build/styles/block-library/social-links/editor-rtl.min.css 339 B
build/styles/block-library/social-links/editor.css 738 B
build/styles/block-library/social-links/editor.min.css 338 B
build/styles/block-library/social-links/style-rtl.css 1.57 kB
build/styles/block-library/social-links/style-rtl.min.css 1.51 kB
build/styles/block-library/social-links/style.css 1.57 kB
build/styles/block-library/social-links/style.min.css 1.51 kB
build/styles/block-library/spacer/editor-rtl.css 774 B
build/styles/block-library/spacer/editor-rtl.min.css 346 B
build/styles/block-library/spacer/editor.css 774 B
build/styles/block-library/spacer/editor.min.css 346 B
build/styles/block-library/spacer/style-rtl.css 55 B
build/styles/block-library/spacer/style-rtl.min.css 48 B
build/styles/block-library/spacer/style.css 55 B
build/styles/block-library/spacer/style.min.css 48 B
build/styles/block-library/style-rtl.css 20.2 kB
build/styles/block-library/style-rtl.min.css 16.8 kB
build/styles/block-library/style.css 20.4 kB
build/styles/block-library/style.min.css 16.8 kB
build/styles/block-library/tab-panels/style-rtl.css 76 B
build/styles/block-library/tab-panels/style-rtl.min.css 65 B
build/styles/block-library/tab-panels/style.css 76 B
build/styles/block-library/tab-panels/style.min.css 65 B
build/styles/block-library/tab/style-rtl.css 248 B
build/styles/block-library/tab/style-rtl.min.css 225 B
build/styles/block-library/tab/style.css 248 B
build/styles/block-library/tab/style.min.css 225 B
build/styles/block-library/table-of-contents/style-rtl.css 89 B
build/styles/block-library/table-of-contents/style-rtl.min.css 83 B
build/styles/block-library/table-of-contents/style.css 89 B
build/styles/block-library/table-of-contents/style.min.css 83 B
build/styles/block-library/table/editor-rtl.css 1.25 kB
build/styles/block-library/table/editor-rtl.min.css 394 B
build/styles/block-library/table/editor.css 1.25 kB
build/styles/block-library/table/editor.min.css 394 B
build/styles/block-library/table/style-rtl.css 1.06 kB
build/styles/block-library/table/style-rtl.min.css 641 B
build/styles/block-library/table/style.css 1.06 kB
build/styles/block-library/table/style.min.css 640 B
build/styles/block-library/table/theme-rtl.css 985 B
build/styles/block-library/table/theme-rtl.min.css 152 B
build/styles/block-library/table/theme.css 985 B
build/styles/block-library/table/theme.min.css 152 B
build/styles/block-library/tabs-menu-item/editor-rtl.css 254 B
build/styles/block-library/tabs-menu-item/editor-rtl.min.css 239 B
build/styles/block-library/tabs-menu-item/editor.css 254 B
build/styles/block-library/tabs-menu-item/editor.min.css 239 B
build/styles/block-library/tabs-menu-item/style-rtl.css 428 B
build/styles/block-library/tabs-menu-item/style-rtl.min.css 398 B
build/styles/block-library/tabs-menu-item/style.css 428 B
build/styles/block-library/tabs-menu-item/style.min.css 398 B
build/styles/block-library/tabs-menu/editor-rtl.css 102 B
build/styles/block-library/tabs-menu/editor-rtl.min.css 93 B
build/styles/block-library/tabs-menu/editor.css 102 B
build/styles/block-library/tabs-menu/editor.min.css 93 B
build/styles/block-library/tabs-menu/style-rtl.css 135 B
build/styles/block-library/tabs-menu/style-rtl.min.css 111 B
build/styles/block-library/tabs-menu/style.css 135 B
build/styles/block-library/tabs-menu/style.min.css 111 B
build/styles/block-library/tabs/style-rtl.css 95 B
build/styles/block-library/tabs/style-rtl.min.css 84 B
build/styles/block-library/tabs/style.css 95 B
build/styles/block-library/tabs/style.min.css 84 B
build/styles/block-library/tag-cloud/style-rtl.css 283 B
build/styles/block-library/tag-cloud/style-rtl.min.css 248 B
build/styles/block-library/tag-cloud/style.css 283 B
build/styles/block-library/tag-cloud/style.min.css 248 B
build/styles/block-library/template-part/editor-rtl.css 1.2 kB
build/styles/block-library/template-part/editor-rtl.min.css 368 B
build/styles/block-library/template-part/editor.css 1.2 kB
build/styles/block-library/template-part/editor.min.css 368 B
build/styles/block-library/template-part/theme-rtl.css 492 B
build/styles/block-library/template-part/theme-rtl.min.css 113 B
build/styles/block-library/template-part/theme.css 492 B
build/styles/block-library/template-part/theme.min.css 113 B
build/styles/block-library/term-count/style-rtl.css 70 B
build/styles/block-library/term-count/style-rtl.min.css 63 B
build/styles/block-library/term-count/style.css 70 B
build/styles/block-library/term-count/style.min.css 63 B
build/styles/block-library/term-description/style-rtl.css 138 B
build/styles/block-library/term-description/style-rtl.min.css 126 B
build/styles/block-library/term-description/style.css 138 B
build/styles/block-library/term-description/style.min.css 126 B
build/styles/block-library/term-name/style-rtl.css 69 B
build/styles/block-library/term-name/style-rtl.min.css 62 B
build/styles/block-library/term-name/style.css 69 B
build/styles/block-library/term-name/style.min.css 62 B
build/styles/block-library/term-template/editor-rtl.css 267 B
build/styles/block-library/term-template/editor-rtl.min.css 225 B
build/styles/block-library/term-template/editor.css 267 B
build/styles/block-library/term-template/editor.min.css 225 B
build/styles/block-library/term-template/style-rtl.css 124 B
build/styles/block-library/term-template/style-rtl.min.css 114 B
build/styles/block-library/term-template/style.css 124 B
build/styles/block-library/term-template/style.min.css 114 B
build/styles/block-library/text-columns/editor-rtl.css 481 B
build/styles/block-library/text-columns/editor-rtl.min.css 95 B
build/styles/block-library/text-columns/editor.css 481 B
build/styles/block-library/text-columns/editor.min.css 95 B
build/styles/block-library/text-columns/style-rtl.css 177 B
build/styles/block-library/text-columns/style-rtl.min.css 165 B
build/styles/block-library/text-columns/style.css 177 B
build/styles/block-library/text-columns/style.min.css 165 B
build/styles/block-library/theme-rtl.css 1.59 kB
build/styles/block-library/theme-rtl.min.css 715 B
build/styles/block-library/theme.css 1.6 kB
build/styles/block-library/theme.min.css 719 B
build/styles/block-library/verse/style-rtl.css 155 B
build/styles/block-library/verse/style-rtl.min.css 137 B
build/styles/block-library/verse/style.css 155 B
build/styles/block-library/verse/style.min.css 137 B
build/styles/block-library/video/editor-rtl.css 825 B
build/styles/block-library/video/editor-rtl.min.css 415 B
build/styles/block-library/video/editor.css 826 B
build/styles/block-library/video/editor.min.css 416 B
build/styles/block-library/video/style-rtl.css 1.02 kB
build/styles/block-library/video/style-rtl.min.css 202 B
build/styles/block-library/video/style.css 1.02 kB
build/styles/block-library/video/style.min.css 202 B
build/styles/block-library/video/theme-rtl.css 967 B
build/styles/block-library/video/theme-rtl.min.css 134 B
build/styles/block-library/video/theme.css 967 B
build/styles/block-library/video/theme.min.css 134 B
build/styles/commands/style-rtl.css 1.86 kB
build/styles/commands/style-rtl.min.css 1 kB
build/styles/commands/style.css 1.86 kB
build/styles/commands/style.min.css 1 kB
build/styles/components/style-rtl.css 16.9 kB
build/styles/components/style-rtl.min.css 13.7 kB
build/styles/components/style.css 17 kB
build/styles/components/style.min.css 13.8 kB
build/styles/customize-widgets/style-rtl.css 2.35 kB
build/styles/customize-widgets/style-rtl.min.css 1.44 kB
build/styles/customize-widgets/style.css 2.35 kB
build/styles/customize-widgets/style.min.css 1.44 kB
build/styles/edit-post/classic-rtl.css 1.29 kB
build/styles/edit-post/classic-rtl.min.css 426 B
build/styles/edit-post/classic.css 1.31 kB
build/styles/edit-post/classic.min.css 427 B
build/styles/edit-post/style-rtl.css 4.08 kB
build/styles/edit-post/style-rtl.min.css 2.63 kB
build/styles/edit-post/style.css 4.09 kB
build/styles/edit-post/style.min.css 2.63 kB
build/styles/edit-site/style-rtl.css 22 kB
build/styles/edit-site/style-rtl.min.css 17 kB
build/styles/edit-site/style.css 22 kB
build/styles/edit-site/style.min.css 17 kB
build/styles/edit-widgets/style-rtl.css 5.24 kB
build/styles/edit-widgets/style-rtl.min.css 3.83 kB
build/styles/edit-widgets/style.css 5.23 kB
build/styles/edit-widgets/style.min.css 3.84 kB
build/styles/editor/style-rtl.css 25.9 kB
build/styles/editor/style-rtl.min.css 20.5 kB
build/styles/editor/style.css 26 kB
build/styles/editor/style.min.css 20.5 kB
build/styles/format-library/style-rtl.css 735 B
build/styles/format-library/style-rtl.min.css 326 B
build/styles/format-library/style.css 746 B
build/styles/format-library/style.min.css 326 B
build/styles/list-reusable-blocks/style-rtl.css 1.07 kB
build/styles/list-reusable-blocks/style-rtl.min.css 250 B
build/styles/list-reusable-blocks/style.css 1.07 kB
build/styles/list-reusable-blocks/style.min.css 249 B
build/styles/media-utils/style-rtl.css 1.61 kB
build/styles/media-utils/style-rtl.min.css 745 B
build/styles/media-utils/style.css 1.61 kB
build/styles/media-utils/style.min.css 742 B
build/styles/nux/style-rtl.css 1.48 kB
build/styles/nux/style-rtl.min.css 622 B
build/styles/nux/style.css 1.5 kB
build/styles/nux/style.min.css 618 B
build/styles/patterns/style-rtl.css 1.46 kB
build/styles/patterns/style-rtl.min.css 611 B
build/styles/patterns/style.css 1.46 kB
build/styles/patterns/style.min.css 611 B
build/styles/preferences/style-rtl.css 1.26 kB
build/styles/preferences/style-rtl.min.css 415 B
build/styles/preferences/style.css 1.26 kB
build/styles/preferences/style.min.css 415 B
build/styles/reusable-blocks/style-rtl.css 1.11 kB
build/styles/reusable-blocks/style-rtl.min.css 275 B
build/styles/reusable-blocks/style.css 1.11 kB
build/styles/reusable-blocks/style.min.css 275 B
build/styles/theme/style-rtl.css 2.65 kB
build/styles/theme/style-rtl.min.css 1.36 kB
build/styles/theme/style.css 2.65 kB
build/styles/theme/style.min.css 1.36 kB
build/styles/widgets/style-rtl.css 2.04 kB
build/styles/widgets/style-rtl.min.css 1.15 kB
build/styles/widgets/style.css 2.04 kB
build/styles/widgets/style.min.css 1.15 kB

compressed-size-action

Comment on lines 279 to 284
/**
* Triggers the invalid event on the search input to force display of
* validation errors, even if the field hasn't been blurred.
* This is useful when validation needs to be shown immediately (e.g., on submit).
*/
const triggerValidationDisplay = () => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is required because LinkControl is not wrapped in a <form> due

  • the fact that LinkControl is a control which can itself exist within a form
  • to a historical Issue with forms and React 17 and nested forms

@getdave getdave changed the title [Prototype] Experiment with URL validation in LinkControl using ValidatedInputControl Add URL validation in LinkControl using ValidatedInputControl Dec 10, 2025
@getdave
Copy link
Contributor Author

getdave commented Dec 10, 2025

@mirka Is there any way to avoid this state?

Screen Shot 2025-12-10 at 15 29 15

Ideally I'd just show the rendered error and not the "popup". At the very least I should be able to trigger only one.

@mirka
Copy link
Member

mirka commented Dec 10, 2025

@mirka Is there any way to avoid this state?

This should be resolved when #73471 is merged 👍


const handleSubmit = () => {
// Centralized validation function
const validateAndSetValidity = () => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This is very similar to handleSelectSuggestion and I'm going to look to merge them. We need a single validation routine.

Copy link
Contributor

Choose a reason for hiding this comment

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

I think this has been completed.

@SirLouen
Copy link
Member

@getdave I've been thinking about #74247 and this
Shouldn't be better to use the URL constructor for validation?

I dont exactly remember what motivated me started working on #74247. Something related with underscores in url. The thing is that originally I was willing only to do a laser fix to this underscores things, just to discover that there was no strong validation at all, neither in Core

For Core, there was a proposal to add https://wiki.php.net/rfc/url_parsing_api with is being supported in PHP 8.5 (so it may need polyfills down to 7.4). Here we could be using the URL Constructor for validation that is pretty much equivalent

Regarding #74247 maybe after finishing on this, which I believe it should be very straightforward if we integrate this constructor, then we could add the intent detection as you suggested.

// Protocol URLs (mailto:, tel:, etc.) are also validated by the native
// URL constructor, so we don't need special handling for them.
const urlToCheck = prependHTTP( trimmedValue );
if ( ! isURL( urlToCheck ) ) {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

@SirLouen Here is where I use isURL.

Copy link
Member

@SirLouen SirLouen Jan 27, 2026

Choose a reason for hiding this comment

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

Oh, I completely overlooked it. Looking good 👌
Shall you move this away from Draft?

@getdave
Copy link
Contributor Author

getdave commented Jan 27, 2026

@jeryj Are you going to be able to pick this one up? I feel it's quite close. Some refinement needed.

The key element is that we only validate on submission to avoid false positives.

It's important we allow for keyword search and URL entry with validation only happening for URLs.

@getdave
Copy link
Contributor Author

getdave commented Jan 27, 2026

@SirLouen I appreciate all your efforts in this area 🙇

Regarding #74247 maybe after finishing on this, which I believe it should be very straightforward if we integrate this constructor, then we could add the intent detection as you suggested.

Is it possible to pare back that PR to a more targeted fix and then propose a larger upgrade post-7.0?

The key context is my comment here (@jeryj you will also want to note this) which describes intent detection vs validation.

@SirLouen
Copy link
Member

The key context is my comment here (@jeryj you will also want to note this) which describes intent detection vs validation.

This is the key:

http://example_test.com → Recognised as URL intent → User submits → Validation error (clear)
example_test.com → Recognised as URL intent → User submits → Validation error
my blog post → Searches Posts/Pages
example (no TLD) → Searches Posts/Pages

For the first two, we need URL validation first in place (isUrl)
And for the two others I believe is actually applying well

gb73486.mp4

- Add onValidate and customValidity props to URLInput
- Integrate ValidatedInputControl when validation props are provided
- Maintain backward compatibility when validation props are not used
- Add validation state tracking via valueRef
- Add test files for validation functionality
- Add temporary validation to LinkControlSearchInput for testing
Copy link
Contributor

Copilot AI left a comment

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 adds real-time URL validation to the LinkControl component to prevent invalid URLs from being submitted. The validation leverages the new ValidatedInputControl component to provide immediate feedback to users when they attempt to enter or submit invalid URLs, improving data quality and user experience.

Changes:

  • Implements URL validation using isURLLike() and the native URL constructor
  • Integrates ValidatedInputControl to display validation errors inline with accessibility support
  • Adds special handling for hash links and entity suggestions to skip validation where appropriate

Reviewed changes

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

File Description
packages/block-editor/src/components/link-control/index.js Adds core validation logic with handleSelectSuggestion and validateAndSetValidity functions, manages validation state, and integrates error display
packages/block-editor/src/components/link-control/search-input.js Passes customValidity prop through to URLInput component and configures markWhenOptional to suppress "(Required)" indicator
packages/block-editor/src/components/url-input/index.js Conditionally switches between InputControl and ValidatedInputControl based on presence of customValidity prop
packages/block-editor/src/components/link-control/test/index.js Adds comprehensive test suite covering valid/invalid URLs, hash links, entity suggestions, and edge cases

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

// but the key point is that invalid URLs should not be submitted
await waitFor(
() => {
// Give it a moment to process
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

The test comment on lines 3122-3124 contains an empty callback in waitFor that does nothing. This appears to be a workaround for timing issues and makes the test less clear. Consider either removing this waitFor block entirely (if onChange not being called is immediate) or adding a more meaningful assertion within the callback.

Suggested change
// Give it a moment to process
expect( mockOnChange ).not.toHaveBeenCalled();

Copilot uses AI. Check for mistakes.
Comment on lines 3301 to 3453
await waitFor(
() => {
// Give validation a moment to process
},
{ timeout: 1000 }
);

// onChange should not be called because validation should prevent submission
expect( mockOnChange ).not.toHaveBeenCalled();
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

Similar to the previous test, this waitFor on lines 3301-3306 contains an empty callback that does nothing meaningful. This pattern of using waitFor with empty callbacks to "give it a moment to process" is not a reliable testing approach and makes tests harder to understand. Consider removing this or adding a specific assertion.

Suggested change
await waitFor(
() => {
// Give validation a moment to process
},
{ timeout: 1000 }
);
// onChange should not be called because validation should prevent submission
expect( mockOnChange ).not.toHaveBeenCalled();
await waitFor( () => {
// onChange should not be called because validation should prevent submission
expect( mockOnChange ).not.toHaveBeenCalled();
} );

Copilot uses AI. Check for mistakes.
const urlToValidate = updatedValue?.url || currentUrlInputValue;

// If empty, validation will fail
if ( ! urlToValidate?.trim()?.length ) {
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

When the URL is empty in handleSelectSuggestion (line 315-317), the function returns early without setting any validation error. This means users won't see any error message explaining why the submission was prevented. Consider setting a validation error message before returning, or handle this case more explicitly to provide better user feedback.

Suggested change
if ( ! urlToValidate?.trim()?.length ) {
if ( ! urlToValidate?.trim()?.length ) {
setCustomValidity( {
type: 'invalid',
message: __( 'Please enter a URL.' ),
} );
triggerValidationDisplay();

Copilot uses AI. Check for mistakes.
);
} );

it( 'should accept valid URLs without protocol (prepends http://)', async () => {
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

The test description states "prepends http://" but the assertion on line 3187 expects the URL to remain as "www.wordpress.org" without any protocol prepended. This test description is misleading - while prependHTTP is used during validation internally, the actual stored URL value is not modified. Consider updating the test description to clarify this behavior, such as "should accept valid URLs without protocol".

Suggested change
it( 'should accept valid URLs without protocol (prepends http://)', async () => {
it( 'should accept valid URLs without protocol', async () => {

Copilot uses AI. Check for mistakes.
Comment on lines 3109 to 3255
// Use a URL that passes isURLLike but fails URL constructor validation
// Note: Most URLs that pass isURLLike also pass URL constructor, so we test
// with a URL that has spaces (fails isURLLike) to ensure validation works
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

The test comment on lines 3109-3111 states "Use a URL that passes isURLLike but fails URL constructor validation" but then uses "not a url" which actually fails isURLLike (because it contains spaces). This comment is inaccurate and may confuse future developers. Consider updating the comment to accurately describe what is being tested, or use a test input that actually matches the described scenario.

Suggested change
// Use a URL that passes isURLLike but fails URL constructor validation
// Note: Most URLs that pass isURLLike also pass URL constructor, so we test
// with a URL that has spaces (fails isURLLike) to ensure validation works
// Use a value that is clearly not URL-like and fails isURLLike (due to spaces)
// This ensures that invalid input does not create a suggestion and cannot be
// submitted, so validation prevents calling onChange

Copilot uses AI. Check for mistakes.
Comment on lines 276 to 352
const handleSelectSuggestion = ( updatedValue ) => {
// Validate URL suggestions (link, mailto, tel, internal) or manually entered URLs.
// Entity suggestions (post, page, category, etc.) don't need validation as they come from the database.
// However, URL suggestions (created from user input with types like 'link', 'mailto', etc.)
// still need validation as they may contain invalid URLs like "www.wordp".
const isEntitySuggestion =
updatedValue &&
updatedValue.id &&
updatedValue.type &&
! LINK_ENTRY_TYPES.includes( updatedValue.type );

if ( ! isEntitySuggestion ) {
// URL suggestion (link, mailto, tel, internal) or manually entered URL - validate before submitting
// Use the URL from the suggestion, or fall back to currentUrlInputValue
const urlToValidate = updatedValue?.url || currentUrlInputValue;

// If empty, validation will fail
if ( ! urlToValidate?.trim()?.length ) {
return;
}

// Perform validation using the same logic as validateAndSetValidity
const trimmedValue = urlToValidate.trim();

// First check if it looks like a URL (for UX - we only validate URL-like strings)
if ( ! trimmedValue || ! isURLLike( trimmedValue ) ) {
setCustomValidity( {
type: 'invalid',
message: __( 'Please enter a valid URL.' ),
} );
triggerValidationDisplay();
return;
}

// Hash links (internal anchor links like #section) are valid and don't need
// URL constructor validation. They're already validated by isURLLike.
const isHashLink =
trimmedValue.startsWith( '#' ) &&
isValidFragment( trimmedValue );

if ( ! isHashLink ) {
// Perform URL validation using the native URL constructor as the authoritative source.
// Protocol URLs (mailto:, tel:, etc.) are also validated by the native
// URL constructor, so we don't need special handling for them.
const urlToCheck = prependHTTP( trimmedValue );
if ( ! isURL( urlToCheck ) ) {
setCustomValidity( {
type: 'invalid',
message: __( 'Please enter a valid URL.' ),
} );
triggerValidationDisplay();
return;
}
}
}
Copy link

Copilot AI Jan 27, 2026

Choose a reason for hiding this comment

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

There is significant code duplication between handleSelectSuggestion and validateAndSetValidity. Both functions perform the same validation logic (checking isURLLike, hash links, and using isURL). Consider extracting the validation logic into a separate helper function that both can call. This will make the code easier to maintain and reduce the risk of the two implementations diverging over time.

Copilot uses AI. Check for mistakes.
- Wire up URLInput to accept and pass through onValidate and customValidity props
- Add URL validation using isURLLike that runs on submit (not while typing)
- Centralize validation and submission logic in LinkControl
- Remove duplicate validation from LinkControlSearchInput
- Ensure Enter key submission validates the same as button submission
Empty values are always disallowed since the submit button is disabled when empty and handleSubmitWithEnter checks for empty before calling handleSubmit.
- Add force?: boolean option to customValidity type
- Update ControlWithError to bypass isTouched guard when force is true
- Use force: true in LinkControl when validation fails on submit
- Allows validation errors to display immediately without requiring blur
… display

Replace the removed `force` API with `reportValidity()` to trigger the
invalid event, ensuring validation errors display immediately on submit
even if the field hasn't been blurred. Extract the validation trigger
logic into a reusable `triggerValidationDisplay()` function for future use.
@jeryj jeryj marked this pull request as ready for review January 28, 2026 22:50
@jeryj jeryj requested a review from ellatrix as a code owner January 28, 2026 22:50
@github-actions
Copy link

github-actions bot commented Jan 28, 2026

The following accounts have interacted with this PR and/or linked issues. I will continue to update these lists as activity occurs. You can also manually ask me to refresh this list by adding the props-bot label.

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: getdave <get_dave@git.wordpress.org>
Co-authored-by: jeryj <jeryj@git.wordpress.org>
Co-authored-by: SirLouen <sirlouen@git.wordpress.org>
Co-authored-by: scruffian <scruffian@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: paaljoachim <paaljoachim@git.wordpress.org>

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

@jeryj jeryj added [Type] Enhancement A suggestion for improvement. [Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) labels Jan 28, 2026
@jeryj
Copy link
Contributor

jeryj commented Jan 28, 2026

This is ready for review. I've:

  • Cleaned up the code (refactored for simplicity, reduced duplication)
  • Fixed a focus loss bug caused by using both an ValidatedInputControl and InputControl and added e2e test.
  • Fixed the unit tests
  • Allow relative links to pass validation (e.g. /internal-path, ../back-a-level) for both isURLLike and LinkControl

If any tests fail, I'll address them tomorrow.

@jeryj jeryj requested a review from SirLouen January 28, 2026 22:54
Copy link
Contributor Author

@getdave getdave left a comment

Choose a reason for hiding this comment

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

This is really close and is looking a lot better than when I left off with it. Thank you!

I left a few questions and suggestions.

As this is a critical path I'd like to get manual testing from @scruffian @MaggieCabrera @mikachan.

Also pinging @paaljoachim who has been active testing a number of link and navigation editing elements recently.

Lastly pinging @mirka for confidence check regarding compatibility with Validated Form components.

expect( editSubmitButton ).toHaveAttribute( 'aria-disabled', 'false' );
} );

it( 'should disable Apply button when URL is cleared', async () => {
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Thank you so much for adding these tests. They greatly increase confidence without the heavy overhead of e2e tests.

Nit: I think we could use .each() to simplify the test verbosity here (https://jestjs.io/docs/api#each).

There are a few of the tests that will still need to be stand alone. That's fine - it makes them clearer anyway.

Comment on lines +99 to +107
it( 'returns true for relative paths starting with ./', () => {
expect( isRelativePath( './page' ) ).toBe( true );
expect( isRelativePath( './nested/page' ) ).toBe( true );
} );

it( 'returns true for parent relative paths starting with ../', () => {
expect( isRelativePath( '../page' ) ).toBe( true );
expect( isRelativePath( '../parent/page' ) ).toBe( true );
} );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Are these actually legit in a URL context? I'm not sure about them.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, ../ works in the link editor and produces a link that will bring you back a level.

Frontend of site with '../' link in href

Comment on lines 288 to 299
// Use requestAnimationFrame to ensure the custom validity has been
// set on the input element by React before calling reportValidity().
window.requestAnimationFrame( () => {
const inputElement = searchInputRef.current;
if (
inputElement &&
typeof inputElement.reportValidity === 'function'
) {
inputElement.reportValidity();
}
} );
};
Copy link
Contributor Author

Choose a reason for hiding this comment

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

My understanding is that this had been resolved by the Components team working on Form component validation.

@mirka shipped a fix to ValidatedInputControl - or at least that what I thought.

Copy link
Contributor

Choose a reason for hiding this comment

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

This was from your initial start - I didn't explore this part. I'll look into it and remove it if it's no longer needed.

// Note: We rely on the native URL constructor rather than implementing custom TLD
// validation to avoid blocking valid URLs. If a URL passes the native constructor,
// it's technically valid according to web standards.
const urlToCheck = prependHTTP( trimmedValue );
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
const urlToCheck = prependHTTP( trimmedValue );
const urlToCheck = prependHTTPs( trimmedValue );

Should we force this?

Copy link
Contributor

Choose a reason for hiding this comment

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

Probably better to default to the secure one.

Copy link
Contributor

Choose a reason for hiding this comment

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

Actually, this is just for validating and doesn't impact what value actually gets stored, so I think it doesn't matter here. Also, probably best to default to http:// and let their server handle redirecting http:// to https://. If they don't have https:// and we default to it, then their link is broken.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah, if #75005 is geting merged, then yes, let's switch to https://.

@paaljoachim
Copy link
Contributor

paaljoachim commented Jan 29, 2026

Testing in https://playground.wordpress.net/

Conclusion.
First example using www.wordp will not show a validation error based on what I noticed in Playground. It does create a link.
Adding abn and clicking enter shows validation error.
Adding www.abn does not show an error.

So basically one can add www.anythinggoes and click enter and a link will be added.


Enter an invalid URL like "www.wordp" and press Enter - validation error should appear immediately
---> No validation error showed up.

Screenshot 2026-01-29 at 16 29 53

Enter a valid URL like "https://wordpress.org/" - should be accepted
---> Works.

Screenshot 2026-01-29 at 16 32 43

Enter a hash link like "#section" - should be accepted
--> Works.

Enter a relative link like "/about" - should be accepted
--> Works.

Select an entity suggestion (post/page) from dropdown - should bypass validation
---> Works.

Screenshot 2026-01-29 at 16 32 43

Btw I tried clicking the link icon directly in the toolbar that did not work. So this means one has to click the icon in the popup/dialog box.

Enter an incomplete URL and click "Apply" - validation error should appear
---> Works

Screenshot 2026-01-29 at 16 36 29

@jeryj
Copy link
Contributor

jeryj commented Jan 29, 2026

Thanks so much for the review @paaljoachim! 🙇🏻

Enter an invalid URL like "www.wordp" and press Enter - validation error should appear immediately

We're using native URL validity with new URL( urlString ), but prepending the value with https:// if needed. So, the chain goes:

  • input "www.wordp"
  • Submit
  • validity prepends https:// to the submission
  • submission checks new URL( 'https://www.wordp' )
  • This is considered valid, albeit a stretch in real world usage :)
new URL('https://www.wordp' ); check in console showing valid link

So, while I agree that for most people this will be considered a broken link, it's technically a valid url. So, rather than implement our own standard of validitity, I think we should rely on whatever passes new URL().

@getdave
Copy link
Contributor Author

getdave commented Jan 30, 2026

@paaljoachim Thanks for solid testing.

I think for v1 we should lean into the URL standard as implemented in browsers. This avoids us accidentally restricting with our own policies when we think we know what people need.

Perhaps in the future we can add a warning message that appears if people enter without a TLD? But if it's technically a valid URL then we should probably avoid blocking creation.

What do you both think?

@paaljoachim
Copy link
Contributor

This sounds like a good idea:

I think for v1 we should lean into the URL standard as implemented in browsers. This avoids us accidentally restricting with our own policies when we think we know what people need.

@scruffian
Copy link
Contributor

This is looking good. I found one very small bug:

  1. Highlight the text to add a link
  2. Open link control
  3. Don't type anything
  4. Mouse down on a page link and hold (don't mouseup)
  5. The error message displays until you release your mouse
Screenshot 2026-02-02 at 11 24 55

Copy link
Contributor

@scruffian scruffian left a comment

Choose a reason for hiding this comment

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

This is looking good. I found one minor issue but I don't think that should stop us merging.

@jeryj jeryj merged commit a98fa51 into trunk Feb 2, 2026
41 of 42 checks passed
@jeryj jeryj deleted the add/linkcontrol-inline-error-state branch February 2, 2026 14:56
@github-actions github-actions bot added this to the Gutenberg 22.6 milestone Feb 2, 2026
adamsilverstein pushed a commit that referenced this pull request Feb 3, 2026
Validate submitted URL with native URL() constructor.

---------

Co-authored-by: getdave <get_dave@git.wordpress.org>
Co-authored-by: jeryj <jeryj@git.wordpress.org>
Co-authored-by: SirLouen <sirlouen@git.wordpress.org>
Co-authored-by: scruffian <scruffian@git.wordpress.org>
Co-authored-by: mirka <0mirka00@git.wordpress.org>
Co-authored-by: paaljoachim <paaljoachim@git.wordpress.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

[Feature] Link Editing Link components (LinkControl, URLInput) and integrations (RichText link formatting) [Package] Block editor /packages/block-editor [Type] Enhancement A suggestion for improvement.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Inline Error State UI in LinkControl

7 participants