wp core update 6.6

This commit is contained in:
Tony Volpe
2024-07-17 03:05:30 +00:00
parent 8f93917880
commit 4950d23a30
912 changed files with 103325 additions and 124480 deletions

View File

@@ -902,27 +902,6 @@ $( function() {
$document.trigger( 'wp-collapse-menu', { state: menuState } );
});
/**
* Handles the `aria-haspopup` attribute on the current menu item when it has a submenu.
*
* @since 4.4.0
*
* @return {void}
*/
function currentMenuItemHasPopup() {
var $current = $( 'a.wp-has-current-submenu' );
if ( 'folded' === menuState ) {
// When folded or auto-folded and not responsive view, the current menu item does have a fly-out sub-menu.
$current.attr( 'aria-haspopup', 'true' );
} else {
// When expanded or in responsive view, reset aria-haspopup.
$current.attr( 'aria-haspopup', 'false' );
}
}
$document.on( 'wp-menu-state-set wp-collapse-menu wp-responsive-activate wp-responsive-deactivate', currentMenuItemHasPopup );
/**
* Ensures an admin submenu is within the visual viewport.
*
@@ -1169,7 +1148,7 @@ $( function() {
lastClicked = this;
// Toggle the "Select all" checkboxes depending if the other ones are all checked or not.
var unchecked = $(this).closest('tbody').find('tr.iedit').find(':checkbox').filter(':visible:enabled').not(':checked');
var unchecked = $(this).closest('tbody').find('tr').find(':checkbox').filter(':visible:enabled').not(':checked');
/**
* Determines if all checkboxes are checked.
@@ -1695,8 +1674,10 @@ $( function() {
// Modify functionality based on custom activate/deactivate event.
$document.on( 'wp-responsive-activate.wp-responsive', function() {
self.activate();
self.toggleAriaHasPopup( 'add' );
}).on( 'wp-responsive-deactivate.wp-responsive', function() {
self.deactivate();
self.toggleAriaHasPopup( 'remove' );
});
$( '#wp-admin-bar-menu-toggle a' ).attr( 'aria-expanded', 'false' );
@@ -1748,7 +1729,7 @@ $( function() {
setTimeout( function() {
var focusIsInToggle = $.contains( toggleButton, focusedElement );
var focusIsInSidebar = $.contains( sidebar, focusedElement );
if ( ! focusIsInToggle && ! focusIsInSidebar ) {
$( toggleButton ).trigger( 'click.wp-responsive' );
}
@@ -1762,8 +1743,9 @@ $( function() {
if ( ! $adminmenu.data('wp-responsive') ) {
return;
}
let state = ( 'false' === $( this ).attr( 'aria-expanded' ) ) ? 'true' : 'false';
$( this ).parent( 'li' ).toggleClass( 'selected' );
$( this ).attr( 'aria-expanded', state );
$( this ).trigger( 'focus' );
event.preventDefault();
});
@@ -1837,6 +1819,34 @@ $( function() {
this.maybeDisableSortables();
},
/**
* Toggles the aria-haspopup attribute for the responsive admin menu.
*
* The aria-haspopup attribute is only necessary for the responsive menu.
* See ticket https://core.trac.wordpress.org/ticket/43095
*
* @since 6.6.0
*
* @param {string} action Whether to add or remove the aria-haspopup attribute.
*
* @return {void}
*/
toggleAriaHasPopup: function( action ) {
var elements = $adminmenu.find( '[data-ariahaspopup]' );
if ( action === 'add' ) {
elements.each( function() {
$( this ).attr( 'aria-haspopup', 'menu' ).attr( 'aria-expanded', 'false' );
} );
return;
}
elements.each( function() {
$( this ).removeAttr( 'aria-haspopup' ).removeAttr( 'aria-expanded' );
} );
},
/**
* Sets the responsiveness and enables the overlay based on the viewport width.
*
@@ -2034,7 +2044,6 @@ $( function() {
window.wpResponsive.init();
setPinMenu();
setMenuState();
currentMenuItemHasPopup();
makeNoticesDismissible();
aria_button_if_js();

File diff suppressed because one or more lines are too long

View File

@@ -1799,7 +1799,7 @@
section.closeDetails();
} else {
// Escape from the inifinite scroll list.
// Escape from the infinite scroll list.
section.headerContainer.find( '.customize-themes-section-title' ).focus();
}
event.stopPropagation(); // Prevent section from being collapsed.
@@ -1917,7 +1917,7 @@
section.contentContainer.on( 'click', '.feature-filter-toggle', function( e ) {
var $themeContainer = $( '.customize-themes-full-container' ),
$filterToggle = $( e.currentTarget );
section.filtersHeight = $filterToggle.parent().next( '.filter-drawer' ).height();
section.filtersHeight = $filterToggle.parents( '.themes-filter-bar' ).next( '.filter-drawer' ).height();
if ( 0 < $themeContainer.scrollTop() ) {
$themeContainer.animate( { scrollTop: 0 }, 400 );
@@ -1932,7 +1932,7 @@
.attr( 'aria-expanded', function( i, attr ) {
return 'true' === attr ? 'false' : 'true';
})
.parent().next( '.filter-drawer' ).slideToggle( 180, 'linear' );
.parents( '.themes-filter-bar' ).next( '.filter-drawer' ).slideToggle( 180, 'linear' );
if ( $filterToggle.hasClass( 'open' ) ) {
var marginOffset = 1018 < window.innerWidth ? 50 : 76;
@@ -3739,7 +3739,7 @@
ready: function() {
var control = this, newItem;
if ( 'dropdown-pages' === control.params.type && control.params.allow_addition ) {
newItem = control.container.find( '.new-content-item' );
newItem = control.container.find( '.new-content-item-wrapper' );
newItem.hide(); // Hide in JS to preserve flex display when showing.
control.container.on( 'click', '.add-new-toggle', function( e ) {
$( e.currentTarget ).slideUp( 180 );
@@ -4085,7 +4085,7 @@
}
toggle = control.container.find( '.add-new-toggle' );
container = control.container.find( '.new-content-item' );
container = control.container.find( '.new-content-item-wrapper' );
input = control.container.find( '.create-item-input' );
title = input.val();
select = control.container.find( 'select' );
@@ -7199,7 +7199,7 @@
} ) );
/**
* Return whether the pubish settings section should be active.
* Return whether the publish settings section should be active.
*
* @return {boolean} Is section active.
*/

File diff suppressed because one or more lines are too long

View File

@@ -2,7 +2,7 @@
* @output wp-admin/js/customize-nav-menus.js
*/
/* global _wpCustomizeNavMenusSettings, wpNavMenu, console */
/* global menus, _wpCustomizeNavMenusSettings, wpNavMenu, console */
( function( api, wp, $ ) {
'use strict';
@@ -1132,6 +1132,8 @@
$( '#menu-to-edit' ).removeAttr( 'id' );
wpNavMenu.menuList.attr( 'id', 'menu-to-edit' ).addClass( 'menu' );
api.Menus.MenuItemControl.prototype.initAccessibility();
_.each( api.section( section.id ).controls(), function( control ) {
if ( 'nav_menu_item' === control.params.type ) {
control.actuallyEmbed();
@@ -1574,6 +1576,80 @@
};
},
/**
* Set up the initial state of the screen reader accessibility information for menu items.
*
* @since 6.6.0
*/
initAccessibility: function() {
var control = this,
menu = $( '#menu-to-edit' );
// Refresh the accessibility when the user comes close to the item in any way.
menu.on( 'mouseenter.refreshAccessibility focus.refreshAccessibility touchstart.refreshAccessibility', '.menu-item', function(){
control.refreshAdvancedAccessibilityOfItem( $( this ).find( 'button.item-edit' ) );
} );
// We have to update on click as well because we might hover first, change the item, and then click.
menu.on( 'click', 'button.item-edit', function() {
control.refreshAdvancedAccessibilityOfItem( $( this ) );
} );
},
/**
* refreshAdvancedAccessibilityOfItem( [itemToRefresh] )
*
* Refreshes advanced accessibility buttons for one menu item.
* Shows or hides buttons based on the location of the menu item.
*
* @param {Object} itemToRefresh The menu item that might need its advanced accessibility buttons refreshed
*
* @since 6.6.0
*/
refreshAdvancedAccessibilityOfItem: function( itemToRefresh ) {
// Only refresh accessibility when necessary.
if ( true !== $( itemToRefresh ).data( 'needs_accessibility_refresh' ) ) {
return;
}
var primaryItems, itemPosition, title,
parentItem, parentItemId, parentItemName, subItems, totalSubItems,
$this = $( itemToRefresh ),
menuItem = $this.closest( 'li.menu-item' ).first(),
depth = menuItem.menuItemDepth(),
isPrimaryMenuItem = ( 0 === depth ),
itemName = $this.closest( '.menu-item-handle' ).find( '.menu-item-title' ).text(),
menuItemType = $this.closest( '.menu-item-handle' ).find( '.item-type' ).text(),
totalMenuItems = $( '#menu-to-edit li' ).length;
if ( isPrimaryMenuItem ) {
primaryItems = $( '.menu-item-depth-0' ),
itemPosition = primaryItems.index( menuItem ) + 1,
totalMenuItems = primaryItems.length,
// String together help text for primary menu items.
title = menus.menuFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalMenuItems );
} else {
parentItem = menuItem.prevAll( '.menu-item-depth-' + parseInt( depth - 1, 10 ) ).first(),
parentItemId = parentItem.find( '.menu-item-data-db-id' ).val(),
parentItemName = parentItem.find( '.menu-item-title' ).text(),
subItems = $( '.menu-item .menu-item-data-parent-id[value="' + parentItemId + '"]' ),
totalSubItems = subItems.length,
itemPosition = $( subItems.parents( '.menu-item' ).get().reverse() ).index( menuItem ) + 1;
// String together help text for sub menu items.
if ( depth < 2 ) {
title = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalSubItems ).replace( '%5$s', parentItemName );
} else {
title = menus.subMenuMoreDepthFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalSubItems ).replace( '%5$s', parentItemName ).replace( '%6$d', depth );
}
}
$this.find( '.screen-reader-text' ).text( title );
// Mark this item's accessibility as refreshed.
$this.data( 'needs_accessibility_refresh', false );
},
/**
* Override the embed() method to do nothing,
* so that the control isn't embedded on load,
@@ -1607,6 +1683,9 @@
}
control.renderContent();
control.deferred.embedded.resolve(); // This triggers control.ready().
// Mark all menu items as unprocessed.
$( 'button.item-edit' ).data( 'needs_accessibility_refresh', true );
},
/**
@@ -1679,22 +1758,15 @@
control.moveDown();
} else if ( isMoveLeft ) {
control.moveLeft();
if ( 1 === control.params.depth ) {
control.container.find( '.is-submenu' ).hide();
} else {
control.container.find( '.is-submenu' ).show();
}
} else if ( isMoveRight ) {
control.moveRight();
control.params.depth += 1;
if ( 0 === control.params.depth ) {
control.container.find( '.is-submenu' ).hide();
} else {
control.container.find( '.is-submenu' ).show();
}
}
moveBtn.focus(); // Re-focus after the container was moved.
// Mark all menu items as unprocessed.
$( 'button.item-edit' ).data( 'needs_accessibility_refresh', true );
} );
},
@@ -2726,6 +2798,9 @@
menuItemControl.setting.set( setting );
});
// Mark all menu items as unprocessed.
$( 'button.item-edit' ).data( 'needs_accessibility_refresh', true );
});
});

File diff suppressed because one or more lines are too long

View File

@@ -388,7 +388,7 @@
},
/**
* Adds keyboard accessiblity to the panel.
* Adds keyboard accessibility to the panel.
*/
keyboardAccessible: function( event ) {
var isEnter = ( event.which === 13 ),
@@ -1623,7 +1623,8 @@
// @todo This should use the Notifications API introduced to panels. See <https://core.trac.wordpress.org/ticket/38794>.
noticeContainer = $( '<div></div>', {
'class': 'no-widget-areas-rendered-notice'
'class': 'no-widget-areas-rendered-notice',
'role': 'alert'
});
panelMetaContainer.append( noticeContainer );

File diff suppressed because one or more lines are too long

View File

@@ -92,7 +92,7 @@ jQuery( function($) {
setTimeout( function(){
// Request the widget content.
p.load( ajaxurl + '?action=dashboard-widgets&widget=' + id + '&pagenow=' + pagenow, '', function() {
// Hide the parent and slide it out for visual fancyness.
// Hide the parent and slide it out for visual fanciness.
p.hide().slideDown('normal', function(){
$(this).css('display', '');
});

View File

@@ -1552,7 +1552,7 @@
// Bind and unbind based on the distraction free writing focus.
$document.on( 'dfw-on.focus', mceBind ).on( 'dfw-off.focus', mceUnbind );
// Focuse the editor when it is the target of the click event.
// Focus the editor when it is the target of the click event.
editor.on( 'click', function( event ) {
if ( event.target === editor.getDoc().documentElement ) {
editor.focus();

View File

@@ -265,7 +265,7 @@ window.wp = window.wp || {};
}
/**
* Gets a list of unique shortcodes or shortcode-look-alikes in the content.
* Gets a list of unique shortcodes or shortcode-lookalikes in the content.
*
* @param {string} content The content we want to scan for shortcodes.
*/
@@ -561,7 +561,7 @@ window.wp = window.wp || {};
* By default TinyMCE wraps loose inline tags in a `<p>`.
* When removing selection markers an empty `<p>` may be left behind, remove it.
*
* @param {Object} $marker The marker to be removed from the editor DOM, wrapped in an instnce of `editor.$`
* @param {Object} $marker The marker to be removed from the editor DOM, wrapped in an instance of `editor.$`
*/
function removeSelectionMarker( $marker ) {
var $markerParent = $marker.parent();

View File

@@ -449,12 +449,13 @@
}
var thisLink, thisLinkText, primaryItems, itemPosition, title,
parentItem, parentItemId, parentItemName, subItems,
parentItem, parentItemId, parentItemName, subItems, totalSubItems,
$this = $( itemToRefresh ),
menuItem = $this.closest( 'li.menu-item' ).first(),
depth = menuItem.menuItemDepth(),
isPrimaryMenuItem = ( 0 === depth ),
itemName = $this.closest( '.menu-item-handle' ).find( '.menu-item-title' ).text(),
menuItemType = $this.closest( '.menu-item-handle' ).find( '.item-controls' ).find( '.item-type' ).text(),
position = parseInt( menuItem.index(), 10 ),
prevItemDepth = ( isPrimaryMenuItem ) ? depth : parseInt( depth - 1, 10 ),
prevItemNameLeft = menuItem.prevAll('.menu-item-depth-' + prevItemDepth).first().find( '.menu-item-title' ).text(),
@@ -503,18 +504,22 @@
primaryItems = $( '.menu-item-depth-0' ),
itemPosition = primaryItems.index( menuItem ) + 1,
totalMenuItems = primaryItems.length,
// String together help text for primary menu items.
title = menus.menuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$d', totalMenuItems );
title = menus.menuFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalMenuItems );
} else {
parentItem = menuItem.prevAll( '.menu-item-depth-' + parseInt( depth - 1, 10 ) ).first(),
parentItemId = parentItem.find( '.menu-item-data-db-id' ).val(),
parentItemName = parentItem.find( '.menu-item-title' ).text(),
subItems = $( '.menu-item .menu-item-data-parent-id[value="' + parentItemId + '"]' ),
totalSubItems = subItems.length,
itemPosition = $( subItems.parents('.menu-item').get().reverse() ).index( menuItem ) + 1;
// String together help text for sub menu items.
title = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$d', itemPosition ).replace( '%3$s', parentItemName );
if ( depth < 2 ) {
title = menus.subMenuFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalSubItems ).replace( '%5$s', parentItemName );
} else {
title = menus.subMenuMoreDepthFocus.replace( '%1$s', itemName ).replace( '%2$s', menuItemType ).replace( '%3$d', itemPosition ).replace( '%4$d', totalSubItems ).replace( '%5$s', parentItemName ).replace( '%6$d', depth );
}
}
$this.attr( 'aria-label', title );
@@ -732,6 +737,7 @@
api.refreshKeyboardAccessibility();
api.refreshAdvancedAccessibility();
api.refreshAdvancedAccessibilityOfItem( ui.item.find( 'a.item-edit' ) );
},
change: function(e, ui) {
// Make sure the placeholder is inside the menu.

File diff suppressed because one or more lines are too long

View File

@@ -47,7 +47,7 @@ jQuery( function( $ ) {
$requestRow.after( function() {
return '<tr class="' + resultRowClasses + '"><th colspan="5">' +
'<div class="notice inline notice-alt ' + classes + '">' +
'<div class="notice inline notice-alt ' + classes + '" role="alert">' +
'<p>' + summaryMessage + '</p>' +
itemList +
'</div>' +

File diff suppressed because one or more lines are too long

View File

@@ -191,7 +191,7 @@ wp.themePluginEditor = (function( $ ) {
return;
}
// Scroll ot the line that has the error.
// Scroll to the line that has the error.
if ( component.lintErrors.length ) {
component.instance.codemirror.setCursor( component.lintErrors[0].from.line );
return;

View File

@@ -96,7 +96,7 @@ themes.view.Appearance = wp.Backbone.View.extend({
},
// Defines search element container.
searchContainer: $( '.search-form' ),
searchContainer: $( '.search-form .search-box' ),
// Search input and view
// for current theme collection.
@@ -118,7 +118,7 @@ themes.view.Appearance = wp.Backbone.View.extend({
// Render and append after screen title.
view.render();
this.searchContainer
.append( $.parseHTML( '<label class="screen-reader-text" for="wp-filter-search-input">' + l10n.search + '</label>' ) )
.append( $.parseHTML( '<label for="wp-filter-search-input">' + l10n.search + '</label>' ) )
.append( view.el )
.on( 'submit', function( event ) {
event.preventDefault();
@@ -926,7 +926,7 @@ themes.view.Preview = themes.view.Details.extend({
currentPreviewDevice = this.$el.data( 'current-preview-device' );
if ( currentPreviewDevice ) {
self.tooglePreviewDeviceButtons( currentPreviewDevice );
self.togglePreviewDeviceButtons( currentPreviewDevice );
}
themes.router.navigate( themes.router.baseUrl( themes.router.themePath + this.model.get( 'id' ) ), { replace: false } );
@@ -988,10 +988,10 @@ themes.view.Preview = themes.view.Details.extend({
.addClass( 'preview-' + device )
.data( 'current-preview-device', device );
this.tooglePreviewDeviceButtons( device );
this.togglePreviewDeviceButtons( device );
},
tooglePreviewDeviceButtons: function( newDevice ) {
togglePreviewDeviceButtons: function( newDevice ) {
var $devices = $( '.wp-full-overlay-footer .devices' );
$devices.find( 'button' )
@@ -1359,7 +1359,6 @@ themes.view.Search = wp.Backbone.View.extend({
searching: false,
attributes: {
placeholder: l10n.searchPlaceholder,
type: 'search',
'aria-describedby': 'live-search-desc'
},

File diff suppressed because one or more lines are too long

View File

@@ -875,7 +875,7 @@
$card
.addClass( 'plugin-card-update-failed' )
.append( '<div class="notice notice-error notice-alt is-dismissible"><p>' + errorMessage + '</p></div>' );
.append( '<div class="notice notice-error notice-alt is-dismissible" role="alert"><p>' + errorMessage + '</p></div>' );
$card.on( 'click', '.notice.is-dismissible .notice-dismiss', function() {
@@ -2260,7 +2260,7 @@
// Remove any existing error.
$filesystemForm.find( '.notice' ).remove();
$filesystemForm.find( '#request-filesystem-credentials-title' ).after( '<div class="notice notice-alt notice-error"><p>' + message + '</p></div>' );
$filesystemForm.find( '#request-filesystem-credentials-title' ).after( '<div class="notice notice-alt notice-error" role="alert"><p>' + message + '</p></div>' );
};
/**
@@ -2913,13 +2913,41 @@
wp.updates.adminNotice = wp.template( 'wp-bulk-updates-admin-notice' );
var successMessage = null;
if ( success ) {
if ( 'plugin' === response.update ) {
successMessage = sprintf(
/* translators: %s: Number of plugins. */
_n( '%s plugin successfully updated.', '%s plugins successfully updated.', success ),
success
);
} else {
successMessage = sprintf(
/* translators: %s: Number of themes. */
_n( '%s theme successfully updated.', '%s themes successfully updated.', success ),
success
);
}
}
var errorMessage = null;
if ( error ) {
errorMessage = sprintf(
/* translators: %s: Number of failed updates. */
_n( '%s update failed.', '%s updates failed.', error ),
error
);
}
wp.updates.addAdminNotice( {
id: 'bulk-action-notice',
className: 'bulk-action-notice',
successes: success,
errors: error,
errorMessages: errorMessages,
type: response.update
successMessage: successMessage,
errorMessage: errorMessage,
errorMessages: errorMessages,
type: response.update
} );
$bulkActionNotice = $( '#bulk-action-notice' ).on( 'click', 'button', function() {

File diff suppressed because one or more lines are too long

View File

@@ -5,6 +5,7 @@
/* global ajaxurl, pwsL10n, userProfileL10n */
(function($) {
var updateLock = false,
isSubmitting = false,
__ = wp.i18n.__,
$pass1Row,
$pass1,
@@ -15,6 +16,8 @@
$submitButtons,
$submitButton,
currentPass,
$form,
originalFormContent,
$passwordWrapper;
function generatePassword() {
@@ -148,7 +151,9 @@
* @param {string} message The message to insert.
*/
function addInlineNotice( $this, success, message ) {
var resultDiv = $( '<div />' );
var resultDiv = $( '<div />', {
role: 'alert'
} );
// Set up the notice div.
resultDiv.addClass( 'notice inline' );
@@ -454,6 +459,12 @@
bindPasswordForm();
bindPasswordResetLink();
$submitButtons.on( 'click', function() {
isSubmitting = true;
});
$form = $( '#your-profile, #createuser' );
originalFormContent = $form.serialize();
});
$( '#destroy-sessions' ).on( 'click', function( e ) {
@@ -465,10 +476,10 @@
}).done( function( response ) {
$this.prop( 'disabled', true );
$this.siblings( '.notice' ).remove();
$this.before( '<div class="notice notice-success inline"><p>' + response.message + '</p></div>' );
$this.before( '<div class="notice notice-success inline" role="alert"><p>' + response.message + '</p></div>' );
}).fail( function( response ) {
$this.siblings( '.notice' ).remove();
$this.before( '<div class="notice notice-error inline"><p>' + response.message + '</p></div>' );
$this.before( '<div class="notice notice-error inline" role="alert"><p>' + response.message + '</p></div>' );
});
e.preventDefault();
@@ -481,7 +492,10 @@
if ( true === updateLock ) {
return __( 'Your new password has not been saved.' );
}
} );
if ( originalFormContent !== $form.serialize() && ! isSubmitting ) {
return __( 'The changes you made will be lost if you navigate away from this page.' );
}
});
/*
* We need to generate a password as soon as the Reset Password page is loaded,

File diff suppressed because one or more lines are too long

View File

@@ -148,7 +148,7 @@ wp.customHtmlWidgets = ( function( $ ) {
} ) );
}
} else if ( 0 !== errorAnnotations.length ) {
errorNotice = $( '<div class="inline notice notice-error notice-alt"></div>' );
errorNotice = $( '<div class="inline notice notice-error notice-alt" role="alert"></div>' );
errorNotice.append( $( '<p></p>', {
text: message
} ) );

File diff suppressed because one or more lines are too long

View File

@@ -158,7 +158,7 @@ wp.mediaWidgets = ( function( $ ) {
}
} else {
if ( ! noticeContainer.length ) {
noticeContainer = $( '<div class="media-widget-embed-notice notice notice-error notice-alt"></div>' );
noticeContainer = $( '<div class="media-widget-embed-notice notice notice-error notice-alt" role="alert"></div>' );
noticeContainer.hide();
embedLinkView.views.parent.$el.prepend( noticeContainer );
}

File diff suppressed because one or more lines are too long