Make WordPress Core

Changeset 55919


Ignore:
Timestamp:
06/14/2023 08:40:42 PM (12 months ago)
Author:
joedolson
Message:

Media: Update admin image editor design.

Significant restructure of the admin image editor interface, but no new functionality. Reorganize editing buttons into a common region at the top of the editor. Move image rotation tools into a pop-out menu. Add 180 degree rotation option. Add scale button to control group. Move sidebar tools next to the editing canvas to improve visual proximity between action and result. Enlarge editing canvas and crop handles. Separate activating crop functions from applying crop. Add numeric inputs for crop & scale values.

A long term goal is to move undo/redo and cancel/save into the modal title bar, but that is not feasible without significant updates to the modal framework.

Props afercia, karmatosed, nrqsnchz, antpb, chaion07, costdev, peterwilsoncc, antpb, sabernhardt, prashantbhivsane, joedolson.
Fixes #50523.

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/.env

    r54096 r55919  
    1313
    1414# Where to run WordPress from. Valid options are 'src' and 'build'.
    15 LOCAL_DIR=src
     15LOCAL_DIR=build
    1616
    1717# The PHP version to use. Valid options are 'latest', and '{version}-fpm'.
  • trunk/src/js/_enqueues/lib/image-edit.js

    r55859 r55919  
    2323
    2424    /**
    25      * Handle crop tool clicks.
    26      */
    27     handleCropToolClick: function( postid, nonce, cropButton ) {
     25     * Enable crop tool.
     26     */
     27    toggleCropTool: function( postid, nonce, cropButton ) {
    2828        var img = $( '#image-preview-' + postid ),
    2929            selection = this.iasapi.getSelection();
    3030
    31         // Ensure selection is available, otherwise reset to full image.
    32         if ( isNaN( selection.x1 ) ) {
    33             this.setCropSelection( postid, { 'x1': 0, 'y1': 0, 'x2': img.innerWidth(), 'y2': img.innerHeight(), 'width': img.innerWidth(), 'height': img.innerHeight() } );
    34             selection = this.iasapi.getSelection();
    35         }
    36 
    37         // If we don't already have a selection, select the entire image.
    38         if ( 0 === selection.x1 && 0 === selection.y1 && 0 === selection.x2 && 0 === selection.y2 ) {
    39             this.iasapi.setSelection( 0, 0, img.innerWidth(), img.innerHeight(), true );
    40             this.iasapi.setOptions( { show: true } );
    41             this.iasapi.update();
     31        imageEdit.toggleControls( cropButton );
     32        var $el = $( cropButton );
     33        var state = ( $el.attr( 'aria-expanded' ) === 'true' ) ? 'true' : 'false';
     34        // Crop tools have been closed.
     35        if ( 'false' === state ) {
     36            // Cancel selection, but do not unset inputs.
     37            this.iasapi.cancelSelection();
     38            imageEdit.setDisabled($('.imgedit-crop-clear'), 0);
    4239        } else {
    43 
     40            imageEdit.setDisabled($('.imgedit-crop-clear'), 1);
     41            // Get values from inputs to restore previous selection.
     42            var startX = ( $( '#imgedit-start-x-' + postid ).val() ) ? $('#imgedit-start-x-' + postid).val() : 0;
     43            var startY = ( $( '#imgedit-start-y-' + postid ).val() ) ? $('#imgedit-start-y-' + postid).val() : 0;
     44            var width = ( $( '#imgedit-sel-width-' + postid ).val() ) ? $('#imgedit-sel-width-' + postid).val() : img.innerWidth();
     45            var height = ( $( '#imgedit-sel-height-' + postid ).val() ) ? $('#imgedit-sel-height-' + postid).val() : img.innerHeight();
     46            // Ensure selection is available, otherwise reset to full image.
     47            if ( isNaN( selection.x1 ) ) {
     48                this.setCropSelection( postid, { 'x1': startX, 'y1': startY, 'x2': width, 'y2': height, 'width': width, 'height': height } );
     49                selection = this.iasapi.getSelection();
     50            }
     51
     52            // If we don't already have a selection, select the entire image.
     53            if ( 0 === selection.x1 && 0 === selection.y1 && 0 === selection.x2 && 0 === selection.y2 ) {
     54                this.iasapi.setSelection( 0, 0, img.innerWidth(), img.innerHeight(), true );
     55                this.iasapi.setOptions( { show: true } );
     56                this.iasapi.update();
     57            } else {
     58                this.iasapi.setSelection( startX, startY, width, height, true );
     59                this.iasapi.setOptions( { show: true } );
     60                this.iasapi.update();
     61            }
     62        }
     63    },
     64
     65    /**
     66     * Handle crop tool clicks.
     67     */
     68    handleCropToolClick: function( postid, nonce, cropButton ) {
     69
     70        if ( cropButton.classList.contains( 'imgedit-crop-clear' ) ) {
     71            this.iasapi.cancelSelection();
     72            imageEdit.setDisabled($('.imgedit-crop-apply'), 0);
     73
     74            $('#imgedit-sel-width-' + postid).val('');
     75            $('#imgedit-sel-height-' + postid).val('');
     76            $('#imgedit-start-x-' + postid).val('0');
     77            $('#imgedit-start-y-' + postid).val('0');
     78            $('#imgedit-selection-' + postid).val('');
     79        } else {
    4480            // Otherwise, perform the crop.
    4581            imageEdit.crop( postid, nonce , cropButton );
     
    123159        $('#imgedit-response-' + postid).empty();
    124160
     161        $('#imgedit-panel-' + postid).on( 'keypress', function(e) {
     162            var nonce = $( '#imgedit-nonce-' + postid ).val();
     163            if ( e.which === 26 && e.ctrlKey ) {
     164                imageEdit.undo( postid, nonce );
     165            }
     166
     167            if ( e.which === 25 && e.ctrlKey ) {
     168                imageEdit.redo( postid, nonce );
     169            }
     170        });
     171
    125172        $('#imgedit-panel-' + postid).on( 'keypress', 'input[type="text"]', function(e) {
    126173            var k = e.keyCode;
     
    171218
    172219    /**
     220     * Shows or hides image menu popup.
     221     *
     222     * @since 6.3.0
     223     *
     224     * @memberof imageEdit
     225     *
     226     * @param {HTMLElement} el The activated control element.
     227     *
     228     * @return {boolean} Always returns false.
     229     */
     230    togglePopup : function(el) {
     231        var $el = $( el );
     232        var $targetEl = $( el ).attr( 'aria-controls' );
     233        var $target = $( '#' + $targetEl );
     234        $el
     235            .attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' );
     236        // Open menu and set z-index to appear above image crop area if it is enabled.
     237        $target
     238            .toggleClass( 'imgedit-popup-menu-open' ).slideToggle( 'fast' ).css( { 'z-index' : 200000 } );
     239        // Move focus to first item in menu.
     240        $target.find( 'button' ).first().trigger( 'focus' );
     241
     242        return false;
     243    },
     244
     245    /**
     246     * Navigate popup menu by arrow keys.
     247     *
     248     * @since 6.3.0
     249     *
     250     * @memberof imageEdit
     251     *
     252     * @param {HTMLElement} el The current element.
     253     *
     254     * @return {boolean} Always returns false.
     255     */
     256    browsePopup : function(el) {
     257        var $el = $( el );
     258        var $collection = $( el ).parent( '.imgedit-popup-menu' ).find( 'button' );
     259        var $index = $collection.index( $el );
     260        var $prev = $index - 1;
     261        var $next = $index + 1;
     262        var $last = $collection.length;
     263        if ( $prev < 0 ) {
     264            $prev = $last - 1;
     265        }
     266        if ( $next === $last ) {
     267            $next = 0;
     268        }
     269        var $target = false;
     270        if ( event.keyCode === 40 ) {
     271            $target = $collection.get( $next );
     272        } else if ( event.keyCode === 38 ) {
     273            $target = $collection.get( $prev );
     274        }
     275        if ( $target ) {
     276            $target.focus();
     277            event.preventDefault();
     278        }
     279
     280        return false;
     281    },
     282
     283    /**
     284     * Close popup menu and reset focus on feature activation.
     285     *
     286     * @since 6.3.0
     287     *
     288     * @memberof imageEdit
     289     *
     290     * @param {HTMLElement} el The current element.
     291     *
     292     * @return {boolean} Always returns false.
     293     */
     294    closePopup : function(el) {
     295        var $parent = $(el).parent( '.imgedit-popup-menu' );
     296        var $controlledID = $parent.attr( 'id' );
     297        var $target = $( 'button[aria-controls="' + $controlledID + '"]' );
     298        $target
     299            .attr( 'aria-expanded', 'false' ).trigger( 'focus' );
     300        $parent
     301            .toggleClass( 'imgedit-popup-menu-open' ).slideToggle( 'fast' );
     302
     303        return false;
     304    },
     305
     306    /**
    173307     * Shows or hides the image edit help box.
    174308     *
     
    186320            .attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' )
    187321            .parents( '.imgedit-group-top' ).toggleClass( 'imgedit-help-toggled' ).find( '.imgedit-help' ).slideToggle( 'fast' );
     322
     323        return false;
     324    },
     325
     326    /**
     327     * Shows or hides image edit input fields when enabled.
     328     *
     329     * @since 6.3.0
     330     *
     331     * @memberof imageEdit
     332     *
     333     * @param {HTMLElement} el The element to trigger the edit panel.
     334     *
     335     * @return {boolean} Always returns false.
     336     */
     337    toggleControls : function(el) {
     338        var $el = $( el );
     339        var $target = $( '#' + $el.attr( 'aria-controls' ) );
     340        $el
     341            .attr( 'aria-expanded', 'false' === $el.attr( 'aria-expanded' ) ? 'true' : 'false' );
     342        $target
     343            .parent( '.imgedit-group' ).toggleClass( 'imgedit-panel-active' );
    188344
    189345        return false;
     
    406562
    407563                if ( $('#imgedit-history-' + postid).val() && $('#imgedit-undone-' + postid).val() === '0' ) {
    408                     $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', false);
     564                    $('button.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', false);
    409565                } else {
    410                     $('input.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);
     566                    $('button.imgedit-submit-btn', '#imgedit-panel-' + postid).prop('disabled', true);
    411567                }
     568                var successMessage = __( 'Image updated.' );
    412569
    413570                t.toggleEditor(postid, 0);
     571                wp.a11y.speak( successMessage, 'assertive' );
    414572            })
    415573            .on( 'error', function() {
     
    714872            selW = $('#imgedit-sel-width-' + postid),
    715873            selH = $('#imgedit-sel-height-' + postid),
     874            selX = $('#imgedit-start-x-' + postid),
     875            selY = $('#imgedit-start-y-' + postid),
    716876            $image = $( image ),
    717877            $img;
     
    772932            onSelectStart: function() {
    773933                imageEdit.setDisabled($('#imgedit-crop-sel-' + postid), 1);
     934                imageEdit.setDisabled($('.imgedit-crop-clear'), 1);
     935                imageEdit.setDisabled($('.imgedit-crop-apply'), 1);
    774936            },
    775937            /**
     
    785947            onSelectEnd: function(img, c) {
    786948                imageEdit.setCropSelection(postid, c);
     949                if ( ! $('#imgedit-crop > *').is(':visible') ) {
     950                    imageEdit.toggleControls($('.imgedit-crop.button'));
     951                }
    787952            },
    788953
     
    801966                selW.val( imageEdit.round(c.width / sizer) );
    802967                selH.val( imageEdit.round(c.height / sizer) );
     968                selX.val( imageEdit.round(c.x1 / sizer) );
     969                selY.val( imageEdit.round(c.y1 / sizer) );
    803970            }
    804971        });
     
    827994            $('#imgedit-sel-width-' + postid).val('');
    828995            $('#imgedit-sel-height-' + postid).val('');
     996            $('#imgedit-start-x-' + postid).val('0');
     997            $('#imgedit-start-y-' + postid).val('0');
    829998            $('#imgedit-selection-' + postid).val('');
    830999            return false;
     
    9571126            return false;
    9581127        }
    959 
     1128        this.closePopup(t);
    9601129        this.addStep({ 'r': { 'r': angle, 'fw': this.hold.h, 'fh': this.hold.w }}, postid, nonce);
    9611130    },
     
    9791148            return false;
    9801149        }
    981 
     1150        this.closePopup(t);
    9821151        this.addStep({ 'f': { 'f': axis, 'fw': this.hold.w, 'fh': this.hold.h }}, postid, nonce);
    9831152    },
     
    10151184        $('#imgedit-sel-width-' + postid).val('');
    10161185        $('#imgedit-sel-height-' + postid).val('');
     1186        $('#imgedit-start-x-' + postid).val('0');
     1187        $('#imgedit-start-y-' + postid).val('0');
    10171188    },
    10181189
     
    10981269    setNumSelection : function( postid, el ) {
    10991270        var sel, elX = $('#imgedit-sel-width-' + postid), elY = $('#imgedit-sel-height-' + postid),
     1271            elX1 = $('#imgedit-start-x-' + postid), elY1 = $('#imgedit-start-y-' + postid),
     1272            xS = this.intval( elX1.val() ), yS = this.intval( elY1.val() ),
    11001273            x = this.intval( elX.val() ), y = this.intval( elY.val() ),
    11011274            img = $('#image-preview-' + postid), imgh = img.height(), imgw = img.width(),
     
    11161289        }
    11171290
    1118         if ( x && y && ( sel = ias.getSelection() ) ) {
     1291        if ( ( ( x && y ) || ( xS && yS ) ) && ( sel = ias.getSelection() ) ) {
    11191292            x2 = sel.x1 + Math.round( x * sizer );
    11201293            y2 = sel.y1 + Math.round( y * sizer );
    1121             x1 = sel.x1;
    1122             y1 = sel.y1;
     1294            x1 = ( xS === sel.x1 ) ? sel.x1 : Math.round( xS * sizer );
     1295            y1 = ( yS === sel.y1 ) ? sel.y1 : Math.round( yS * sizer );
    11231296
    11241297            if ( x2 > imgw ) {
     
    12061379                if ( r > h ) {
    12071380                    r = h;
     1381                    var errorMessage = __( 'Selected crop ratio exceeds the boundaries of the image. Try a different ratio.' );
     1382
     1383                    $( '#imgedit-crop-' + postid )
     1384                        .prepend( '<div class="notice notice-error" tabindex="-1" role="alert"><p>' + errorMessage + '</p></div>' );
     1385
     1386                    wp.a11y.speak( errorMessage, 'assertive' );
    12081387                    if ( n ) {
    1209                         $('#imgedit-crop-height-' + postid).val('');
     1388                        $('#imgedit-crop-height-' + postid).val( '' );
    12101389                    } else {
    1211                         $('#imgedit-crop-width-' + postid).val('');
     1390                        $('#imgedit-crop-width-' + postid).val( '');
     1391                    }
     1392                } else {
     1393                    var error = $( '#imgedit-crop-' + postid ).find( '.notice-error' );
     1394                    if ( 'undefined' !== typeof( error ) ) {
     1395                        error.remove();
    12121396                    }
    12131397                }
     
    12321416     */
    12331417    validateNumeric: function( el ) {
    1234         if ( ! this.intval( $( el ).val() ) ) {
     1418        if ( false === this.intval( $( el ).val() ) ) {
    12351419            $( el ).val( '' );
    12361420            return false;
  • trunk/src/js/_enqueues/vendor/imgareaselect/jquery.imgareaselect.js

    r54928 r55919  
    957957             */
    958958            if (!parseInt($handles.css('width')) >= 0)
    959                 $handles.width(5).height(5);
     959                $handles.width(10).height(10);
    960960
    961961            /*
  • trunk/src/wp-admin/css/common.css

    r55307 r55919  
    192192.popular-tags,
    193193.feature-filter,
    194 .imgedit-group,
    195194.comment-ays {
    196195    border: 1px solid #c3c4c7;
     
    205204.popular-tags,
    206205.feature-filter,
    207 .imgedit-group,
    208206.comment-ays {
    209207    background: #fff;
  • trunk/src/wp-admin/css/media.css

    r55859 r55919  
    878878}
    879879
    880 .imgedit-settings p,
    881 .imgedit-settings fieldset {
     880.image-editor p,
     881.image-editor fieldset {
    882882    margin: 8px 0;
    883883}
    884884
    885 .imgedit-settings legend {
     885.image-editor legend {
    886886    margin-bottom: 5px;
    887887}
    888888
    889 .describe .imgedit-wrap .imgedit-settings {
     889.describe .imgedit-wrap .image-editor {
    890890    padding: 0 5px;
    891891}
     
    899899}
    900900
    901 .wp_attachment_holder .imgedit-wrap .imgedit-panel-content {
    902     float: left;
    903     padding: 3px 16px 0 0;
    904     min-width: 400px;
    905     max-width: calc( 100% - 266px );
    906 }
    907 
    908 .wp_attachment_holder .imgedit-wrap .imgedit-settings {
     901.imgedit-panel-content {
     902    display: grid;
     903    grid-template-columns: 640px 1fr;
     904    gap: 20px;
     905}
     906
     907@media screen and (max-width: 1120px) {
     908    .imgedit-panel-content {
     909        grid-template-columns: 1fr;
     910    }
     911}
     912
     913.imgedit-settings {
     914    max-width: 400px; /* Prevent reflow when help info is expanded. */
     915}
     916
     917.imgedit-group-controls > * {
     918    display: none;
     919}
     920
     921.imgedit-panel-active .imgedit-group-controls > * {
     922    display: block;
     923}
     924
     925.wp_attachment_holder .imgedit-wrap .image-editor {
    909926    float: right;
    910927    width: 250px;
    911928}
    912929
    913 .imgedit-settings input {
     930.image-editor input {
    914931    margin-top: 0;
    915932    vertical-align: middle;
     
    946963
    947964.media-disabled,
    948 .imgedit-settings .disabled {
     965.image-editor .disabled {
    949966    /* WCAG 1.4.3 Text or images of text that are part of an inactive user
    950967       interface component ... have no contrast requirement. */
     
    968985.A1B1 .spinner {
    969986    float: left;
    970 }
    971 
    972 .imgedit-menu {
    973     margin: 0 0 12px;
    974987}
    975988
     
    986999    font-size: 13px;
    9871000    line-height: 2;
    988     margin: 0 8px 8px 0;
    9891001    padding: 0 10px;
    9901002}
     
    10151027}
    10161028
    1017 .imgedit-rleft:before {
    1018     content: "\f166";
    1019 }
    1020 
    1021 .imgedit-rright:before {
     1029.imgedit-scale:before {
     1030    content: "\f211";
     1031}
     1032
     1033.imgedit-rotate:before {
    10221034    content: "\f167";
    1023 }
    1024 
    1025 .imgedit-flipv:before {
    1026     content: "\f168";
    1027 }
    1028 
    1029 .imgedit-fliph:before {
    1030     content: "\f169";
    10311035}
    10321036
     
    10491053}
    10501054
     1055.imgedit-crop-wrap {
     1056    padding: 20px;
     1057    background-image: linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7), linear-gradient(45deg, #c3c4c7 25%, transparent 25%, transparent 75%, #c3c4c7 75%, #c3c4c7);
     1058    background-position: 0 0, 10px 10px;
     1059    background-size: 20px 20px;
     1060}
     1061
     1062
    10511063.imgedit-crop {
    10521064    margin: 0 8px 0 0;
    10531065}
    10541066
    1055 .imgedit-rleft {
    1056     margin: 0 3px;
    1057 }
    1058 
    1059 .imgedit-rright {
    1060     margin: 0 8px 0 3px;
    1061 }
    1062 
    1063 .imgedit-flipv {
    1064     margin: 0 3px;
    1065 }
    1066 
    1067 .imgedit-fliph {
     1067.imgedit-rotate {
    10681068    margin: 0 8px 0 3px;
    10691069}
     
    10751075.imgedit-redo {
    10761076    margin: 0 8px 0 3px;
     1077}
     1078
     1079.imgedit-thumbnail-preview-group {
     1080    display: flex;
     1081    flex-wrap: wrap;
     1082    column-gap: 10px;
    10771083}
    10781084
     
    11031109}
    11041110
     1111.imgedit-popup-menu,
    11051112.imgedit-help {
    11061113    display: none;
    11071114    padding-bottom: 8px;
     1115}
     1116
     1117.imgedit-panel-tools > .imgedit-menu {
     1118    display: flex;
     1119    column-gap: 4px;
     1120    align-items: start;
     1121}
     1122
     1123.imgedit-popup-menu {
     1124    width: fit-content;
     1125    position: absolute;
     1126    left: calc( 100% + 4px );
     1127    top: -3px;
     1128}
     1129
     1130.image-editor .imgedit-menu .imgedit-popup-menu button {
     1131    display: block;
     1132    margin: 2px 0;
     1133    width: 100%;
     1134}
     1135
     1136.imgedit-rotate-menu-container {
     1137    position: relative;
    11081138}
    11091139
     
    11401170}
    11411171
    1142 .imgedit-submit {
    1143     margin: 8px 0 0;
    1144 }
    1145 
    11461172.imgedit-submit-btn {
    11471173    margin-left: 20px;
     
    11741200
    11751201.imgedit-group {
    1176     margin-bottom: 8px;
    1177     padding: 10px;
    1178 }
    1179 
    1180 .imgedit-settings .imgedit-original-dimensions {
     1202    margin-bottom: 20px;
     1203}
     1204
     1205.image-editor .imgedit-original-dimensions {
    11811206    display: inline-block;
    11821207}
    11831208
    1184 .imgedit-settings .imgedit-scale input[type="text"],
    1185 .imgedit-settings .imgedit-crop-ratio input[type="text"],
    1186 .imgedit-settings .imgedit-crop-sel input[type="text"] {
     1209.image-editor .imgedit-scale-controls input[type="text"],
     1210.image-editor .imgedit-crop-ratio input[type="text"],
     1211.image-editor .imgedit-crop-sel input[type="text"] {
    11871212    width: 80px;
    11881213    font-size: 14px;
     
    11981223}
    11991224
    1200 .imgedit-settings .imgedit-scale-button-wrapper {
     1225.image-editor .imgedit-scale-button-wrapper {
    12011226    margin-top: 0.3077em;
    12021227    display: block;
    12031228}
    12041229
    1205 .imgedit-settings .imgedit-scale .button {
     1230.image-editor .imgedit-scale-controls .button {
    12061231    margin-bottom: 0;
    12071232}
     
    12721297    }
    12731298
    1274     .imgedit-settings .imgedit-scale input[type="text"],
    1275     .imgedit-settings .imgedit-crop-ratio input[type="text"],
    1276     .imgedit-settings .imgedit-crop-sel input[type="text"] {
     1299    .image-editor .imgedit-scale input[type="text"],
     1300    .image-editor .imgedit-crop-ratio input[type="text"],
     1301    .image-editor .imgedit-crop-sel input[type="text"] {
    12771302        font-size: 16px;
    12781303        padding: 6px 10px;
     
    12801305
    12811306    .wp_attachment_holder .imgedit-wrap .imgedit-panel-content,
    1282     .wp_attachment_holder .imgedit-wrap .imgedit-settings {
     1307    .wp_attachment_holder .imgedit-wrap .image-editor {
    12831308        float: none;
    12841309        width: auto;
     
    12971322
    12981323    .media-modal .imgedit-wrap .imgedit-panel-content,
    1299     .media-modal .imgedit-wrap .imgedit-settings {
     1324    .media-modal .imgedit-wrap .image-editor {
    13001325        position: initial !important;
    13011326    }
    13021327
    1303     .media-modal .imgedit-wrap .imgedit-settings {
     1328    .media-modal .imgedit-wrap .image-editor {
    13041329        box-sizing: border-box;
    13051330        width: 100% !important;
    13061331    }
    13071332
    1308     .imgedit-settings .imgedit-scale-button-wrapper {
     1333    .image-editor .imgedit-scale-button-wrapper {
    13091334        display: inline-block;
    13101335    }
  • trunk/src/wp-admin/includes/image-edit.php

    r55859 r55919  
    2929    }
    3030
    31     $sizer = $big > 400 ? 400 / $big : 1;
     31    $sizer = $big > 600 ? 600 / $big : 1;
    3232
    3333    $backup_sizes = get_post_meta( $post_id, '_wp_attachment_backup_sizes', true );
     
    5656    <div class="imgedit-wrap wp-clearfix">
    5757    <div id="imgedit-panel-<?php echo $post_id; ?>">
    58 
    59     <div class="imgedit-panel-content wp-clearfix">
    60         <?php echo $note; ?>
     58    <?php echo $note; ?>
     59    <div class="imgedit-panel-content imgedit-panel-tools wp-clearfix">
    6160        <div class="imgedit-menu wp-clearfix">
    62             <button type="button" onclick="imageEdit.handleCropToolClick( <?php echo "$post_id, '$nonce'"; ?>, this )" class="imgedit-crop button disabled" disabled><?php esc_html_e( 'Crop' ); ?></button>
     61            <button type="button" onclick="imageEdit.toggleCropTool( <?php echo "$post_id, '$nonce'"; ?>, this );" aria-expanded="false" aria-controls="imgedit-crop" class="imgedit-crop button disabled" disabled><?php esc_html_e( 'Crop' ); ?></button>
     62            <button type="button" class="imgedit-scale button" onclick="imageEdit.toggleControls(this);" aria-expanded="false" aria-controls="imgedit-scale"><?php esc_html_e( 'Scale' ); ?></button>
     63            <div class="imgedit-rotate-menu-container">
     64                <button type="button" aria-controls="imgedit-rotate-menu" class="imgedit-rotate button" onclick="imageEdit.togglePopup(this)"><?php esc_html_e( 'Image Rotation' ); ?></button>
     65                <div id="imgedit-rotate-menu" class="imgedit-popup-menu">
    6366            <?php
    64 
    6567            // On some setups GD library does not provide imagerotate() - Ticket #11536.
    6668            if ( wp_image_editor_supports(
     
    7274                $note_no_rotate = '';
    7375                ?>
    74                 <button type="button" class="imgedit-rleft button" onclick="imageEdit.rotate( 90, <?php echo "$post_id, '$nonce'"; ?>, this)"><?php esc_html_e( 'Rotate left' ); ?></button>
    75                 <button type="button" class="imgedit-rright button" onclick="imageEdit.rotate(-90, <?php echo "$post_id, '$nonce'"; ?>, this)"><?php esc_html_e( 'Rotate right' ); ?></button>
     76                    <button type="button" class="imgedit-rleft button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate( 90, <?php echo "$post_id, '$nonce'"; ?>, this)"><?php esc_html_e( 'Rotate 90° left' ); ?></button>
     77                    <button type="button" class="imgedit-rright button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(-90, <?php echo "$post_id, '$nonce'"; ?>, this)"><?php esc_html_e( 'Rotate 90° right' ); ?></button>
     78                    <button type="button" class="imgedit-rfull button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.rotate(180, <?php echo "$post_id, '$nonce'"; ?>, this)"><?php esc_html_e( 'Rotate 180°' ); ?></button>
    7679                <?php
    7780            } else {
    7881                $note_no_rotate = '<p class="note-no-rotate"><em>' . __( 'Image rotation is not supported by your web host.' ) . '</em></p>';
    7982                ?>
    80                 <button type="button" class="imgedit-rleft button disabled" disabled></button>
    81                 <button type="button" class="imgedit-rright button disabled" disabled></button>
    82             <?php } ?>
    83 
    84             <button type="button" onclick="imageEdit.flip(1, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-flipv button"><?php esc_html_e( 'Flip vertical' ); ?></button>
    85             <button type="button" onclick="imageEdit.flip(2, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-fliph button"><?php esc_html_e( 'Flip horizontal' ); ?></button>
    86 
    87             <br class="imgedit-undo-redo-separator" />
     83                    <button type="button" class="imgedit-rleft button disabled" disabled></button>
     84                    <button type="button" class="imgedit-rright button disabled" disabled></button>
     85                <?php
     86            }
     87            ?>
     88                    <hr />
     89                    <button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(1, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-flipv button"><?php esc_html_e( 'Flip vertical' ); ?></button>
     90                    <button type="button" onkeyup="imageEdit.browsePopup(this)" onclick="imageEdit.flip(2, <?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-fliph button"><?php esc_html_e( 'Flip horizontal' ); ?></button>
     91                    <?php echo $note_no_rotate; ?>
     92                </div>
     93            </div>
     94        </div>
     95        <div class="imgedit-submit imgedit-menu">
    8896            <button type="button" id="image-undo-<?php echo $post_id; ?>" onclick="imageEdit.undo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-undo button disabled" disabled><?php esc_html_e( 'Undo' ); ?></button>
    8997            <button type="button" id="image-redo-<?php echo $post_id; ?>" onclick="imageEdit.redo(<?php echo "$post_id, '$nonce'"; ?>, this)" class="imgedit-redo button disabled" disabled><?php esc_html_e( 'Redo' ); ?></button>
    90             <?php echo $note_no_rotate; ?>
    91         </div>
    92 
    93         <input type="hidden" id="imgedit-sizer-<?php echo $post_id; ?>" value="<?php echo $sizer; ?>" />
    94         <input type="hidden" id="imgedit-history-<?php echo $post_id; ?>" value="" />
    95         <input type="hidden" id="imgedit-undone-<?php echo $post_id; ?>" value="0" />
    96         <input type="hidden" id="imgedit-selection-<?php echo $post_id; ?>" value="" />
    97         <input type="hidden" id="imgedit-x-<?php echo $post_id; ?>" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
    98         <input type="hidden" id="imgedit-y-<?php echo $post_id; ?>" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
    99 
    100         <div id="imgedit-crop-<?php echo $post_id; ?>" class="imgedit-crop-wrap">
    101         <img id="image-preview-<?php echo $post_id; ?>" onload="imageEdit.imgLoaded('<?php echo $post_id; ?>')"
    102             src="<?php echo esc_url( admin_url( 'admin-ajax.php', 'relative' ) ) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand( 1, 99999 ); ?>" alt="" />
    103         </div>
    104 
    105         <div class="imgedit-submit">
    106             <input type="button" onclick="imageEdit.close(<?php echo $post_id; ?>, 1)" class="button imgedit-cancel-btn" value="<?php esc_attr_e( 'Cancel' ); ?>" />
    107             <input type="button" onclick="imageEdit.save(<?php echo "$post_id, '$nonce'"; ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn" value="<?php esc_attr_e( 'Save' ); ?>" />
     98            <button type="button" onclick="imageEdit.close(<?php echo $post_id; ?>, 1)" class="button imgedit-cancel-btn"><?php esc_html_e( 'Cancel Editing' ); ?></button>
     99            <button type="button" onclick="imageEdit.save(<?php echo "$post_id, '$nonce'"; ?>)" disabled="disabled" class="button button-primary imgedit-submit-btn"><?php esc_html_e( 'Save Edits' ); ?></button>
    108100        </div>
    109101    </div>
    110102
    111     <div class="imgedit-settings">
    112     <div class="imgedit-group">
    113     <div class="imgedit-group-top">
    114         <h2><?php _e( 'Scale Image' ); ?></h2>
    115         <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
    116             <?php
    117             /* translators: Hidden accessibility text. */
    118             esc_html_e( 'Scale Image Help' );
    119             ?>
    120         </span></button>
    121         <div class="imgedit-help">
    122         <p><?php _e( 'You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.' ); ?></p>
     103    <div class="imgedit-panel-content wp-clearfix">
     104        <div class="imgedit-tools">
     105            <input type="hidden" id="imgedit-nonce-<?php echo $post_id; ?>" value="<?php echo $nonce; ?>" />
     106            <input type="hidden" id="imgedit-sizer-<?php echo $post_id; ?>" value="<?php echo $sizer; ?>" />
     107            <input type="hidden" id="imgedit-history-<?php echo $post_id; ?>" value="" />
     108            <input type="hidden" id="imgedit-undone-<?php echo $post_id; ?>" value="0" />
     109            <input type="hidden" id="imgedit-selection-<?php echo $post_id; ?>" value="" />
     110            <input type="hidden" id="imgedit-x-<?php echo $post_id; ?>" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
     111            <input type="hidden" id="imgedit-y-<?php echo $post_id; ?>" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
     112
     113            <div id="imgedit-crop-<?php echo $post_id; ?>" class="imgedit-crop-wrap">
     114            <div class="imgedit-crop-grid"></div>
     115            <img id="image-preview-<?php echo $post_id; ?>" onload="imageEdit.imgLoaded('<?php echo $post_id; ?>')"
     116                src="<?php echo esc_url( admin_url( 'admin-ajax.php', 'relative' ) ) . '?action=imgedit-preview&amp;_ajax_nonce=' . $nonce . '&amp;postid=' . $post_id . '&amp;rand=' . rand( 1, 99999 ); ?>" alt="" />
     117            </div>
    123118        </div>
    124         <?php if ( isset( $meta['width'], $meta['height'] ) ) : ?>
    125         <p>
    126             <?php
    127             printf(
    128                 /* translators: %s: Image width and height in pixels. */
    129                 __( 'Original dimensions %s' ),
    130                 '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
    131             );
    132             ?>
    133         </p>
    134         <?php endif; ?>
    135         <div class="imgedit-submit">
    136 
    137         <fieldset class="imgedit-scale">
    138         <legend><?php _e( 'New dimensions:' ); ?></legend>
    139         <div class="nowrap">
    140         <label for="imgedit-scale-width-<?php echo $post_id; ?>" class="screen-reader-text">
    141             <?php
    142             /* translators: Hidden accessibility text. */
    143             _e( 'scale width' );
    144             ?>
    145         </label>
    146         <input type="number" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>" min="1" max="<?php echo isset( $meta['width'] ) ? $meta['width'] : ''; ?>" step="1" id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" onchange="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
    147         <span class="imgedit-separator" aria-hidden="true">&times;</span>
    148         <label for="imgedit-scale-height-<?php echo $post_id; ?>" class="screen-reader-text">
    149             <?php
    150             /* translators: Hidden accessibility text. */
    151             _e( 'scale height' );
    152             ?>
    153         </label>
    154         <input type="number" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>" min="1" max="<?php echo isset( $meta['height'] ) ? $meta['height'] : ''; ?>" step="1" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onchange="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
    155         <div class="imgedit-scale-button-wrapper"><input id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button button-primary" value="<?php esc_attr_e( 'Scale' ); ?>" /></div>
     119        <div class="imgedit-settings">
     120            <div class="imgedit-tool-active">
     121                <div class="imgedit-group">
     122                <div id="imgedit-scale" tabindex="-1" class="imgedit-group-controls">
     123                    <div class="imgedit-group-top">
     124                        <h2><?php _e( 'Scale Image' ); ?></h2>
     125                        <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
     126                        <?php
     127                        /* translators: Hidden accessibility text. */
     128                        esc_html_e( 'Scale Image Help' );
     129                        ?>
     130                        </span></button>
     131                        <div class="imgedit-help">
     132                        <p><?php _e( 'You can proportionally scale the original image. For best results, scaling should be done before you crop, flip, or rotate. Images can only be scaled down, not up.' ); ?></p>
     133                        </div>
     134                        <?php if ( isset( $meta['width'], $meta['height'] ) ) : ?>
     135                        <p>
     136                            <?php
     137                            printf(
     138                                /* translators: %s: Image width and height in pixels. */
     139                                __( 'Original dimensions %s' ),
     140                                '<span class="imgedit-original-dimensions">' . $meta['width'] . ' &times; ' . $meta['height'] . '</span>'
     141                            );
     142                            ?>
     143                        </p>
     144                        <?php endif; ?>
     145                        <div class="imgedit-submit">
     146                        <fieldset class="imgedit-scale-controls">
     147                            <legend><?php _e( 'New dimensions:' ); ?></legend>
     148                            <div class="nowrap">
     149                            <label for="imgedit-scale-width-<?php echo $post_id; ?>" class="screen-reader-text">
     150                            <?php
     151                            /* translators: Hidden accessibility text. */
     152                            _e( 'scale height' );
     153                            ?>
     154                            </label>
     155                            <input type="number" step="1" min="0" max="<?php echo isset( $meta['width'] ) ? $meta['width'] : ''; ?>" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>"  id="imgedit-scale-width-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 1, this)" value="<?php echo isset( $meta['width'] ) ? $meta['width'] : 0; ?>" />
     156                            <span class="imgedit-separator" aria-hidden="true">&times;</span>
     157                            <label for="imgedit-scale-height-<?php echo $post_id; ?>" class="screen-reader-text"><?php _e( 'scale height' ); ?></label>
     158                            <input type="number" step="1" min="0" max="<?php echo isset( $meta['height'] ) ? $meta['width'] : ''; ?>" aria-describedby="imgedit-scale-warn-<?php echo $post_id; ?>" id="imgedit-scale-height-<?php echo $post_id; ?>" onkeyup="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.scaleChanged(<?php echo $post_id; ?>, 0, this)" value="<?php echo isset( $meta['height'] ) ? $meta['height'] : 0; ?>" />
     159                            <button id="imgedit-scale-button" type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'scale')" class="button button-primary"><?php esc_html_e( 'Scale' ); ?></button>
     160                            <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>"><span class="dashicons dashicons-warning" aria-hidden="true"></span><?php esc_html_e( 'Images cannot be scaled to a size larger than the original.' ); ?></span>
     161                            </div>
     162                        </fieldset>
     163                        </div>
     164                    </div>
     165                </div>
     166            </div>
     167
     168        <?php if ( $can_restore ) { ?>
     169                <div class="imgedit-group">
     170                <div class="imgedit-group-top">
     171                    <h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php _e( 'Restore original image' ); ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
     172                    <div class="imgedit-help imgedit-restore">
     173                    <p>
     174                    <?php
     175                    _e( 'Discard any changes and restore the original image.' );
     176                    if ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) {
     177                        echo ' ' . __( 'Previously edited copies of the image will not be deleted.' );
     178                    }
     179                    ?>
     180                    </p>
     181                    <div class="imgedit-submit">
     182                        <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'restore')" class="button button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> />
     183                    </div>
     184                </div>
     185            </div>
     186            </div>
     187        <?php } ?>
     188            <div class="imgedit-group">
     189                <div id="imgedit-crop" tabindex="-1" class="imgedit-group-controls">
     190                <div class="imgedit-group-top">
     191                    <h2><?php _e( 'Crop Image' ); ?></h2>
     192                    <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
     193                    <?php
     194                    /* translators: Hidden accessibility text. */
     195                    _e( 'Image Crop Help' );
     196                    ?>
     197                    </span></button>
     198                    <div class="imgedit-help">
     199                        <p><?php _e( 'To crop the image, click on it and drag to make your selection.' ); ?></p>
     200                        <p><strong><?php _e( 'Crop Aspect Ratio' ); ?></strong><br />
     201                        <?php _e( 'The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.' ); ?></p>
     202
     203                        <p><strong><?php _e( 'Crop Selection' ); ?></strong><br />
     204                        <?php _e( 'Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.' ); ?></p>
     205                    </div>
     206                </div>
     207                <fieldset class="imgedit-crop-ratio">
     208                    <legend><?php _e( 'Aspect ratio:' ); ?></legend>
     209                    <div class="nowrap">
     210                    <label for="imgedit-crop-width-<?php echo $post_id; ?>" class="screen-reader-text">
     211                    <?php
     212                    /* translators: Hidden accessibility text. */
     213                    _e( 'crop ratio width' );
     214                    ?>
     215                    </label>
     216                    <input type="number" step="1" min="1" id="imgedit-crop-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" />
     217                    <span class="imgedit-separator" aria-hidden="true">:</span>
     218                    <label for="imgedit-crop-height-<?php echo $post_id; ?>" class="screen-reader-text">
     219                    <?php
     220                    /* translators: Hidden accessibility text. */
     221                    _e( 'crop ratio height' );
     222                    ?>
     223                    </label>
     224                    <input  type="number" step="1" min="0" id="imgedit-crop-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" />
     225                    </div>
     226                </fieldset>
     227                <fieldset id="imgedit-crop-sel-<?php echo $post_id; ?>" class="imgedit-crop-sel">
     228                    <legend><?php _e( 'Selection:' ); ?></legend>
     229                    <div class="nowrap">
     230                    <label for="imgedit-sel-width-<?php echo $post_id; ?>" class="screen-reader-text">
     231                    <?php
     232                    /* translators: Hidden accessibility text. */
     233                    _e( 'selection width' );
     234                    ?>
     235                    </label>
     236                    <input  type="number" step="1" min="0" id="imgedit-sel-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
     237                    <span class="imgedit-separator" aria-hidden="true">&times;</span>
     238                    <label for="imgedit-sel-height-<?php echo $post_id; ?>" class="screen-reader-text">
     239                    <?php
     240                    /* translators: Hidden accessibility text. */
     241                    _e( 'selection height' );
     242                    ?>
     243                    </label>
     244                    <input  type="number" step="1" min="0" id="imgedit-sel-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
     245                    </div>
     246                </fieldset>
     247                <fieldset id="imgedit-crop-sel-<?php echo $post_id; ?>" class="imgedit-crop-sel">
     248                    <legend><?php _e( 'Starting Coordinates:' ); ?></legend>
     249                    <div class="nowrap">
     250                    <label for="imgedit-start-x-<?php echo $post_id; ?>" class="screen-reader-text">
     251                    <?php
     252                    /* translators: Hidden accessibility text. */
     253                    _e( 'horizontal start position' );
     254                    ?>
     255                    </label>
     256                    <input  type="number" step="1" min="0" id="imgedit-start-x-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" value="0" />
     257                    <span class="imgedit-separator" aria-hidden="true">&times;</span>
     258                    <label for="imgedit-start-y-<?php echo $post_id; ?>" class="screen-reader-text">
     259                    <?php
     260                    /* translators: Hidden accessibility text. */
     261                    _e( 'vertical start position' );
     262                    ?>
     263                    </label>
     264                    <input  type="number" step="1" min="0" id="imgedit-start-y-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" value="0" />
     265                    </div>
     266                </fieldset>
     267                <div class="imgedit-crop-apply imgedit-menu container">
     268                    <button class="button-primary" type="button" onclick="imageEdit.handleCropToolClick( <?php echo "$post_id, '$nonce'"; ?>, this );" class="imgedit-crop-apply button"><?php esc_html_e( 'Apply Crop' ); ?></button> <button type="button" onclick="imageEdit.handleCropToolClick( <?php echo "$post_id, '$nonce'"; ?>, this );" class="imgedit-crop-clear button" disabled="disabled"><?php esc_html_e( 'Clear Crop' ); ?></button>
     269                </div>
     270            </div>
    156271        </div>
    157         <span class="imgedit-scale-warn" id="imgedit-scale-warn-<?php echo $post_id; ?>"><span class="dashicons dashicons-warning" aria-hidden="true"></span><?php esc_html_e( 'Images cannot be scaled to a size larger than the original.' ); ?></span>
    158 
    159         </fieldset>
    160 
    161         </div>
    162     </div>
    163     </div>
    164 
    165     <?php if ( $can_restore ) { ?>
    166 
    167     <div class="imgedit-group">
    168     <div class="imgedit-group-top">
    169         <h2><button type="button" onclick="imageEdit.toggleHelp(this);" class="button-link" aria-expanded="false"><?php _e( 'Restore original image' ); ?> <span class="dashicons dashicons-arrow-down imgedit-help-toggle"></span></button></h2>
    170         <div class="imgedit-help imgedit-restore">
    171         <p>
    172             <?php
    173             _e( 'Discard any changes and restore the original image.' );
    174 
    175             if ( ! defined( 'IMAGE_EDIT_OVERWRITE' ) || ! IMAGE_EDIT_OVERWRITE ) {
    176                 echo ' ' . __( 'Previously edited copies of the image will not be deleted.' );
    177             }
    178             ?>
    179         </p>
    180         <div class="imgedit-submit">
    181         <input type="button" onclick="imageEdit.action(<?php echo "$post_id, '$nonce'"; ?>, 'restore')" class="button button-primary" value="<?php esc_attr_e( 'Restore image' ); ?>" <?php echo $can_restore; ?> />
    182         </div>
    183         </div>
    184     </div>
    185     </div>
    186 
    187     <?php } ?>
    188 
    189     <div class="imgedit-group">
    190     <div class="imgedit-group-top">
    191         <h2><?php _e( 'Image Crop' ); ?></h2>
    192         <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
    193             <?php
    194             /* translators: Hidden accessibility text. */
    195             esc_html_e( 'Image Crop Help' );
    196             ?>
    197         </span></button>
    198 
    199         <div class="imgedit-help">
    200         <p><?php _e( 'To crop the image, click on it and drag to make your selection.' ); ?></p>
    201 
    202         <p><strong><?php _e( 'Crop Aspect Ratio' ); ?></strong><br />
    203         <?php _e( 'The aspect ratio is the relationship between the width and height. You can preserve the aspect ratio by holding down the shift key while resizing your selection. Use the input box to specify the aspect ratio, e.g. 1:1 (square), 4:3, 16:9, etc.' ); ?></p>
    204 
    205         <p><strong><?php _e( 'Crop Selection' ); ?></strong><br />
    206         <?php _e( 'Once you have made your selection, you can adjust it by entering the size in pixels. The minimum selection size is the thumbnail size as set in the Media settings.' ); ?></p>
    207         </div>
    208     </div>
    209 
    210     <fieldset class="imgedit-crop-ratio">
    211         <legend><?php _e( 'Aspect ratio:' ); ?></legend>
    212         <div class="nowrap">
    213         <label for="imgedit-crop-width-<?php echo $post_id; ?>" class="screen-reader-text">
    214             <?php
    215             /* translators: Hidden accessibility text. */
    216             _e( 'crop ratio width' );
    217             ?>
    218         </label>
    219         <input type="text" id="imgedit-crop-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 0, this)" />
    220         <span class="imgedit-separator" aria-hidden="true">:</span>
    221         <label for="imgedit-crop-height-<?php echo $post_id; ?>" class="screen-reader-text">
    222             <?php
    223             /* translators: Hidden accessibility text. */
    224             _e( 'crop ratio height' );
    225             ?>
    226         </label>
    227         <input type="text" id="imgedit-crop-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" onblur="imageEdit.setRatioSelection(<?php echo $post_id; ?>, 1, this)" />
    228         </div>
    229     </fieldset>
    230 
    231     <fieldset id="imgedit-crop-sel-<?php echo $post_id; ?>" class="imgedit-crop-sel">
    232         <legend><?php _e( 'Selection:' ); ?></legend>
    233         <div class="nowrap">
    234         <label for="imgedit-sel-width-<?php echo $post_id; ?>" class="screen-reader-text">
    235             <?php
    236             /* translators: Hidden accessibility text. */
    237             _e( 'selection width' );
    238             ?>
    239         </label>
    240         <input type="text" id="imgedit-sel-width-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
    241         <span class="imgedit-separator" aria-hidden="true">&times;</span>
    242         <label for="imgedit-sel-height-<?php echo $post_id; ?>" class="screen-reader-text">
    243             <?php
    244             /* translators: Hidden accessibility text. */
    245             _e( 'selection height' );
    246             ?>
    247         </label>
    248         <input type="text" id="imgedit-sel-height-<?php echo $post_id; ?>" onkeyup="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" onblur="imageEdit.setNumSelection(<?php echo $post_id; ?>, this)" />
    249         </div>
    250     </fieldset>
    251 
    252272    </div>
    253273
     
    258278
    259279    <div class="imgedit-group imgedit-applyto">
    260     <div class="imgedit-group-top">
    261         <h2><?php _e( 'Thumbnail Settings' ); ?></h2>
    262         <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
     280        <div class="imgedit-group-top">
     281            <h2><?php _e( 'Thumbnail Settings' ); ?></h2>
     282            <button type="button" class="dashicons dashicons-editor-help imgedit-help-toggle" onclick="imageEdit.toggleHelp(this);" aria-expanded="false"><span class="screen-reader-text">
    263283            <?php
    264284            /* translators: Hidden accessibility text. */
    265285            esc_html_e( 'Thumbnail Settings Help' );
    266286            ?>
    267         </span></button>
    268         <div class="imgedit-help">
    269         <p><?php _e( 'You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.' ); ?></p>
     287            </span></button>
     288            <div class="imgedit-help">
     289            <p><?php _e( 'You can edit the image while preserving the thumbnail. For example, you may wish to have a square thumbnail that displays just a section of the image.' ); ?></p>
     290            </div>
     291        </div>
     292        <div class="imgedit-thumbnail-preview-group">
     293            <figure class="imgedit-thumbnail-preview">
     294                <img src="<?php echo $thumb['url']; ?>" width="<?php echo $thumb_img[0]; ?>" height="<?php echo $thumb_img[1]; ?>" class="imgedit-size-preview" alt="" draggable="false" />
     295                <figcaption class="imgedit-thumbnail-preview-caption"><?php _e( 'Current thumbnail' ); ?></figcaption>
     296            </figure>
     297            <div id="imgedit-save-target-<?php echo $post_id; ?>" class="imgedit-save-target">
     298            <fieldset>
     299                <legend><?php _e( 'Apply changes to:' ); ?></legend>
     300
     301                <span class="imgedit-label">
     302                    <input type="radio" id="imgedit-target-all" name="imgedit-target-<?php echo $post_id; ?>" value="all" checked="checked" />
     303                    <label for="imgedit-target-all"><?php _e( 'All image sizes' ); ?></label>
     304                </span>
     305
     306                <span class="imgedit-label">
     307                    <input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php echo $post_id; ?>" value="thumbnail" />
     308                    <label for="imgedit-target-thumbnail"><?php _e( 'Thumbnail' ); ?></label>
     309                </span>
     310 
     311                <span class="imgedit-label">
     312                    <input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" />
     313                    <label for="imgedit-target-nothumb"><?php _e( 'All sizes except thumbnail' ); ?></label>
     314                </span>
     315
     316                <?php
     317                if ( $edit_custom_sizes ) {
     318                    if ( ! is_array( $edit_custom_sizes ) ) {
     319                        $edit_custom_sizes = get_intermediate_image_sizes();
     320                    }
     321                    foreach ( array_unique( $edit_custom_sizes ) as $key => $size ) {
     322                        if ( array_key_exists( $size, $meta['sizes'] ) ) {
     323                            if ( 'thumbnail' === $size ) {
     324                                continue;
     325                            }
     326                            ?>
     327                            <span class="imgedit-label">
     328                            <input type="radio" id="imgedit-target-custom<?php echo esc_attr( $key ); ?>" name="imgedit-target-<?php echo $post_id; ?>" value="<?php echo esc_attr( $size ); ?>" />
     329                                <label for="imgedit-target-custom<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $size ); ?></label>
     330                            </span>
     331                            <?php
     332                        }
     333                    }
     334                }
     335                ?>
     336                </fieldset>
     337            </div>
    270338        </div>
    271339    </div>
    272 
    273     <figure class="imgedit-thumbnail-preview">
    274         <img src="<?php echo $thumb['url']; ?>" width="<?php echo $thumb_img[0]; ?>" height="<?php echo $thumb_img[1]; ?>" class="imgedit-size-preview" alt="" draggable="false" />
    275         <figcaption class="imgedit-thumbnail-preview-caption"><?php _e( 'Current thumbnail' ); ?></figcaption>
    276     </figure>
    277 
    278     <div id="imgedit-save-target-<?php echo $post_id; ?>" class="imgedit-save-target">
    279     <fieldset>
    280         <legend><?php _e( 'Apply changes to:' ); ?></legend>
    281 
    282         <span class="imgedit-label">
    283             <input type="radio" id="imgedit-target-all" name="imgedit-target-<?php echo $post_id; ?>" value="all" checked="checked" />
    284             <label for="imgedit-target-all"><?php _e( 'All image sizes' ); ?></label>
    285         </span>
    286 
    287         <span class="imgedit-label">
    288             <input type="radio" id="imgedit-target-thumbnail" name="imgedit-target-<?php echo $post_id; ?>" value="thumbnail" />
    289             <label for="imgedit-target-thumbnail"><?php _e( 'Thumbnail' ); ?></label>
    290         </span>
    291 
    292         <span class="imgedit-label">
    293             <input type="radio" id="imgedit-target-nothumb" name="imgedit-target-<?php echo $post_id; ?>" value="nothumb" />
    294             <label for="imgedit-target-nothumb"><?php _e( 'All sizes except thumbnail' ); ?></label>
    295         </span>
    296         <?php
    297         if ( $edit_custom_sizes ) {
    298             if ( ! is_array( $edit_custom_sizes ) ) {
    299                 $edit_custom_sizes = get_intermediate_image_sizes();
    300             }
    301             foreach ( array_unique( $edit_custom_sizes ) as $key => $size ) {
    302                 if ( array_key_exists( $size, $meta['sizes'] ) ) {
    303                     if ( 'thumbnail' === $size ) {
    304                         continue;
    305                     }
    306                     ?>
    307                     <span class="imgedit-label">
    308                         <input type="radio" id="imgedit-target-custom<?php echo esc_attr( $key ); ?>" name="imgedit-target-<?php echo $post_id; ?>" value="<?php echo esc_attr( $size ); ?>" />
    309                         <label for="imgedit-target-custom<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $size ); ?></label>
    310                     </span>
    311                     <?php
    312                 }
    313             }
    314         }
    315         ?>
    316     </fieldset>
     340    <?php } ?>
     341        </div>
    317342    </div>
     343
    318344    </div>
    319 
    320     <?php } ?>
    321 
    322     </div>
     345    <div class="imgedit-wait" id="imgedit-wait-<?php echo $post_id; ?>"></div>
     346    <div class="hidden" id="imgedit-leaving-<?php echo $post_id; ?>"><?php _e( "There are unsaved changes that will be lost. 'OK' to continue, 'Cancel' to return to the Image Editor." ); ?></div>
    323347
    324348    </div>
     
    510534function _image_get_preview_ratio( $w, $h ) {
    511535    $max = max( $w, $h );
    512     return $max > 400 ? ( 400 / $max ) : 1;
     536    return $max > 600 ? ( 600 / $max ) : 1;
    513537}
    514538
  • trunk/src/wp-includes/css/media-views.css

    r55896 r55919  
    19581958.media-modal .imgedit-wrap .imgedit-panel-content {
    19591959    padding: 16px 16px 0;
    1960     position: absolute;
    1961     top: 0;
    1962     right: 282px;
    1963     bottom: 0;
    1964     left: 0;
    1965     overflow: auto;
    1966 }
    1967 
    1968 /*
    1969  * Implementation of bottom padding in overflow content differs across browsers.
    1970  * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
    1971  */
    1972 .media-modal .imgedit-wrap .imgedit-submit {
    1973     margin-bottom: 16px;
    1974 }
    1975 
    1976 .media-modal .imgedit-wrap .imgedit-settings {
    1977     background: #f6f7f7;
    1978     border-left: 1px solid #dcdcde;
    1979     padding: 20px 16px 0;
    1980     position: absolute;
    1981     top: 0;
    1982     right: 0;
    1983     bottom: 0;
    1984     width: 250px;
    1985     overflow: auto;
     1960    overflow: visible;
    19861961}
    19871962
     
    19971972    background: none;
    19981973    border: none;
    1999     border-bottom: 1px solid #dcdcde;
    20001974    box-shadow: none;
    20011975    margin: 0;
     1976    padding: 0;
     1977    position: relative; /* RTL fix, #WP29352 */
     1978}
     1979
     1980.media-modal .imgedit-group.imgedit-panel-active {
    20021981    margin-bottom: 16px;
    2003     padding: 0;
    20041982    padding-bottom: 16px;
    2005     position: relative; /* RTL fix, #WP29352 */
    2006 }
    2007 
    2008 .media-modal .imgedit-group:last-of-type {
    2009     border: none;
    2010     margin: 0;
    2011     padding: 0;
    20121983}
    20131984
     
    20782049.media-modal .imgedit-wrap div.updated, /* Back-compat for pre-5.5 */
    20792050.media-modal .imgedit-wrap .notice {
    2080     margin: 0;
    2081     margin-bottom: 16px;
     2051    margin: 0 16px;
    20822052}
    20832053
     
    28282798
    28292799@media screen and (max-width: 782px) {
     2800    .imgedit-panel-content {
     2801        grid-template-columns: auto;
     2802    }
     2803
    28302804    .media-frame-toolbar .media-toolbar {
    28312805        bottom: -54px;
Note: See TracChangeset for help on using the changeset viewer.