WordPress.org

Make WordPress Core

Changeset 40359


Ignore:
Timestamp:
03/31/17 17:37:58 (3 months ago)
Author:
afercia
Message:

Accessibility: Improve the Media Library inline uploader accessibility.

For better accessibility, expandable panels should be placed immediately after
the control that expands them. This change moves the Media Library inline
uploader up, right after the "Add New" button, also introducing consistency with
the Plugin and Theme uploaders.
Adds a proper ARIA role on the button and an aria-expanded attribute to give
better feedback to assistive technologies users about the uploader's expanded state.
Improves the focus handling when closing the uploader, improves the focus style
and color contrast ratio of the uploader "close" button.

Props mantismamita, karmatosed, adamsilverstein, afercia.
Fixes #37188.

Location:
trunk/src
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/css/media.css

    r40052 r40359  
    470470    position: relative; 
    471471    width: auto; 
    472     margin-bottom: 16px; 
     472    margin-top: 12px; 
    473473    padding: 0 16px; 
    474474    border-left: 4px solid #dd3d36; 
     
    527527    bottom: auto; 
    528528    padding-top: 0; 
    529     margin-top: 0; 
     529    margin-top: 20px; 
    530530    border: 4px dashed #b4b9be; 
    531531} 
  • trunk/src/wp-admin/upload.php

    r39526 r40359  
    7878        <?php 
    7979        if ( current_user_can( 'upload_files' ) ) { ?> 
    80             <a href="<?php echo admin_url( 'media-new.php' ); ?>" class="page-title-action"><?php echo esc_html_x( 'Add New', 'file' ); ?></a><?php 
     80            <a href="<?php echo admin_url( 'media-new.php' ); ?>" class="page-title-action aria-button-if-js"><?php echo esc_html_x( 'Add New', 'file' ); ?></a><?php 
    8181        } 
    8282        ?> 
  • trunk/src/wp-includes/css/media-views.css

    r40358 r40359  
    11341134    cursor: pointer; 
    11351135    height: 48px; 
    1136     position: absolute; 
    1137     right: 0; 
     1136    outline: none; 
     1137    padding: 0; 
     1138    position: absolute; 
     1139    right: 2px; 
    11381140    text-align: center; 
    1139     top: 0; 
    1140     width: 50px; 
     1141    top: 2px; 
     1142    width: 48px; 
    11411143    z-index: 1; 
    11421144} 
    11431145 
    11441146.uploader-inline .close:before { 
    1145     font: normal 30px/50px dashicons !important; 
    1146     color: #72777c; 
     1147    font: normal 30px/1 dashicons !important; 
     1148    color: #555d66; 
    11471149    display: inline-block; 
    11481150    content: "\f335"; 
    11491151    font-weight: 300; 
     1152    margin-top: 1px; 
     1153} 
     1154 
     1155.uploader-inline .close:focus { 
     1156    outline: 1px solid  #5b9dd9; 
     1157    -webkit-box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); 
     1158    box-shadow: 0 0 3px rgba( 0, 115, 170, .8 ); 
    11501159} 
    11511160 
  • trunk/src/wp-includes/js/media-grid.js

    r40076 r40359  
    624624        this.$window = $( window ); 
    625625        this.$adminBar = $( '#wpadminbar' ); 
     626        // Store the Add New button for later reuse in wp.media.view.UploaderInline. 
     627        this.$uploaderToggler = $( '.page-title-action' ) 
     628            .attr( 'aria-expanded', 'false' ) 
     629            .on( 'click', _.bind( this.addNewClickHandler, this ) ); 
     630 
    626631        this.$window.on( 'scroll resize', _.debounce( _.bind( this.fixPosition, this ), 15 ) ); 
    627         $( document ).on( 'click', '.page-title-action', _.bind( this.addNewClickHandler, this ) ); 
    628632 
    629633        // Ensure core and media grid view UI is enabled. 
  • trunk/src/wp-includes/js/media-views.js

    r40126 r40359  
    37723772        this.controller.on( 'toggle:upload:attachment', this.toggleUploader, this ); 
    37733773        this.controller.on( 'edit:selection', this.editSelection ); 
    3774         this.createToolbar(); 
     3774 
    37753775        // In the Media Library, the sidebar is used to display errors before the attachments grid. 
    37763776        if ( this.options.sidebar && 'errors' === this.options.sidebar ) { 
    37773777            this.createSidebar(); 
    37783778        } 
     3779 
     3780        /* 
     3781         * For accessibility reasons, place the Inline Uploader before other sections. 
     3782         * This way, in the Media Library, it's right after the Add New button, see ticket #37188. 
     3783         */ 
    37793784        this.createUploader(); 
     3785 
     3786        /* 
     3787         * Create a multi-purpose toolbar. Used as main toolbar in the Media Library 
     3788         * and also for other things, for example the "Drag and drop to reorder" and 
     3789         * "Suggested dimensions" info in the media modal. 
     3790         */ 
     3791        this.createToolbar(); 
     3792 
     3793        // Create the list of attachments. 
    37803794        this.createAttachments(); 
     3795 
    37813796        // For accessibility reasons, place the normal sidebar after the attachments, see ticket #36909. 
    37823797        if ( this.options.sidebar && 'errors' !== this.options.sidebar ) { 
    37833798            this.createSidebar(); 
    37843799        } 
     3800 
    37853801        this.updateContent(); 
    37863802 
     
    40754091        }); 
    40764092 
    4077         this.uploader.hide(); 
     4093        this.uploader.$el.addClass( 'hidden' ); 
    40784094        this.views.add( this.uploader ); 
    40794095    }, 
     
    82118227    show: function() { 
    82128228        this.$el.removeClass( 'hidden' ); 
     8229        if ( this.controller.$uploaderToggler.length ) { 
     8230            this.controller.$uploaderToggler.attr( 'aria-expanded', 'true' ); 
     8231        } 
    82138232    }, 
    82148233    hide: function() { 
    82158234        this.$el.addClass( 'hidden' ); 
     8235        if ( this.controller.$uploaderToggler.length ) { 
     8236            this.controller.$uploaderToggler 
     8237                .attr( 'aria-expanded', 'false' ) 
     8238                // Move focus back to the toggle button when closing the uploader. 
     8239                .focus(); 
     8240        } 
    82168241    } 
    82178242 
  • trunk/src/wp-includes/js/media/views/attachments/browser.js

    r40126 r40359  
    4141        this.controller.on( 'toggle:upload:attachment', this.toggleUploader, this ); 
    4242        this.controller.on( 'edit:selection', this.editSelection ); 
    43         this.createToolbar(); 
     43 
    4444        // In the Media Library, the sidebar is used to display errors before the attachments grid. 
    4545        if ( this.options.sidebar && 'errors' === this.options.sidebar ) { 
    4646            this.createSidebar(); 
    4747        } 
     48 
     49        /* 
     50         * For accessibility reasons, place the Inline Uploader before other sections. 
     51         * This way, in the Media Library, it's right after the Add New button, see ticket #37188. 
     52         */ 
    4853        this.createUploader(); 
     54 
     55        /* 
     56         * Create a multi-purpose toolbar. Used as main toolbar in the Media Library 
     57         * and also for other things, for example the "Drag and drop to reorder" and 
     58         * "Suggested dimensions" info in the media modal. 
     59         */ 
     60        this.createToolbar(); 
     61 
     62        // Create the list of attachments. 
    4963        this.createAttachments(); 
     64 
    5065        // For accessibility reasons, place the normal sidebar after the attachments, see ticket #36909. 
    5166        if ( this.options.sidebar && 'errors' !== this.options.sidebar ) { 
    5267            this.createSidebar(); 
    5368        } 
     69 
    5470        this.updateContent(); 
    5571 
     
    344360        }); 
    345361 
    346         this.uploader.hide(); 
     362        this.uploader.$el.addClass( 'hidden' ); 
    347363        this.views.add( this.uploader ); 
    348364    }, 
  • trunk/src/wp-includes/js/media/views/frame/manage.js

    r40076 r40359  
    3939        this.$window = $( window ); 
    4040        this.$adminBar = $( '#wpadminbar' ); 
     41        // Store the Add New button for later reuse in wp.media.view.UploaderInline. 
     42        this.$uploaderToggler = $( '.page-title-action' ) 
     43            .attr( 'aria-expanded', 'false' ) 
     44            .on( 'click', _.bind( this.addNewClickHandler, this ) ); 
     45 
    4146        this.$window.on( 'scroll resize', _.debounce( _.bind( this.fixPosition, this ), 15 ) ); 
    42         $( document ).on( 'click', '.page-title-action', _.bind( this.addNewClickHandler, this ) ); 
    4347 
    4448        // Ensure core and media grid view UI is enabled. 
  • trunk/src/wp-includes/js/media/views/uploader/inline.js

    r33337 r40359  
    120120    show: function() { 
    121121        this.$el.removeClass( 'hidden' ); 
     122        if ( this.controller.$uploaderToggler.length ) { 
     123            this.controller.$uploaderToggler.attr( 'aria-expanded', 'true' ); 
     124        } 
    122125    }, 
    123126    hide: function() { 
    124127        this.$el.addClass( 'hidden' ); 
     128        if ( this.controller.$uploaderToggler.length ) { 
     129            this.controller.$uploaderToggler 
     130                .attr( 'aria-expanded', 'false' ) 
     131                // Move focus back to the toggle button when closing the uploader. 
     132                .focus(); 
     133        } 
    125134    } 
    126135 
Note: See TracChangeset for help on using the changeset viewer.